Ansible的Playbook案例

playbook-剧本 介绍
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。

写个playbook实现测试web节点状态

[root@ansible ~]# vim ping.yml 
--- #固定格式
- name: 检查主机的连通性  #name的作用添加一个注释和说明
  hosts: web  #主机的集合
  tasks: #命令的集合 
    - name: 命令1  
      ping:
  # - name: 命令2
  #   ping: 
[root@ansible ~]# ansible-playbook ping.yml  --syntax-check
playbook: ping.yml  #表示语法正确
[root@ansible ~]# ansible-playbook ping.yml 
PLAY [检查主机的连通性]

TASK [Gathering Facts] 
ok: [web2]
ok: [web1]

TASK [命令1]
ok: [web2]
ok: [web1]
 

user模块的使用
利用ansible-doc 模块名可以查看帮助,找到模块的例子直接可以使用

[root@ansible ~]#ansible-doc user  #查看user模块的帮助信息
[root@ansible ~]# vim user.yml 
---
- name: 创建用户
  hosts: web
  tasks: 
    - name: 创建用户
      user:
        name: z3
        uid: 1040
        group: users
    - name: 修改密码
      shell: echo 123 | passwd --stdin z3
[root@ansible ~]# ansible-playbook user.yml

练习1:

  • 所有web主机安装apache
  • 修改配置文件的监听端口为8080
  • 设置默认主页为hello world
  • 启动服务
  • 设置开机自启
[root@ansible ~]# vim httpd.yml
---
- name: 部署httpd
  hosts: web
  tasks:
    - name: 安装httpd
      yum:
        name: httpd
        state: installed
    - name: 修改端口为8080
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        insertafter: '^#Listen '
        line: 'Listen 8080'
    - name: 修改默认首页#也可以使用copy模块
      shell: echo 'hello world' > /var/www/html/index.html
    - name: 重启httpd服务
      service:
        name: httpd
        state: restarted
        enabled: yes
 : ! ansible-doc 模块名 可以不退出vim查看帮助手册

: ! ansible-doc 模块名 可以不退出vim查看帮助手册

[root@ansible ~]# ansible-playbook httpd.yml  --syntax-check
playbook: user.yml
[root@ansible ~]# ansible-playbook httpd.yml 
PLAY [部署httpd] ***********************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************
ok: [web1]
ok: [web2]

TASK [安装httpd] ***********************************************************************************************************************
changed: [web2]
changed: [web1]

TASK [修改端口为8080] *********************************************************************************************************************
changed: [web2]
changed: [web1]

TASK [修改默认首页#也可以使用copy模块] ************************************************************************************************************
changed: [web1]
changed: [web2]

TASK [重启httpd服务] *********************************************************************************************************************
changed: [web1]
changed: [web2]

PLAY RECAP ***************************************************************************************************************************
web1                       : ok=5    changed=4    unreachable=0    failed=0   
web2                       : ok=5    changed=4    unreachable=0    failed=0   

playbook语法进阶

vars介绍:

  • 在palybook中使用vars 表示使用变量
  • 定义变量的格式为key: value,变量是vars的子层所以要放在第二行写
  • 调用变量的格式为 “{{value}}”

实例1:

[root@ansible ~]# vim user.yml 
---
- name: 添加用户
  hosts: web
  vars: #vars表示使用变量 
    username: l4  #格式为key:values
  tasks:
    - name: 添加用户 "{{username}}" #调用变量用户"{{变量名}}"
      user:
        name: "{{username}}"
        group: users
    - name: 修改密码
      shell: echo 123 | passwd --stdin "{{username}}"

外部向playbook传参方法:

  • palybook里只需要调用变量,参数由外部传入,代码详情见下图
  • 方法一 利用json语法,-e 表示调用参数
    [root@ansible ~]# ansible-playbook user.yml -e’{“username”:“dachui”}’
  • 方法二 利用yaml语法
    [root@ansible ~]# ansible-playbook user.yml -e @test.yml
[root@ansible ~]#cat test.yml
---
username: jerry

[root@ansible ~]# vim user.yml 
---
- name: 添加用户
  hosts: web
  tasks:
    - name: 添加用户 "{{username}}" #调用变量用户"{{变量名}}"
      user:
        name: "{{username}}"
        group: users
    - name: 修改密码
      shell: echo 123 | passwd --stdin "{{username}}"
 

ignore_errors的使用:

  • play中只要执行命令的返回值不为0,就会报错,tasks停止,可以添加下面
  • ignore_errors: True #忽略错误,强制返回成功

实例1:
在这里插入图片描述
****在这里插入图片描述


Tags介绍:

  • 在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了
[root@ansible ~]# cat user.yml 
---
- name: 修改web集群
  hosts: web
  tasks:
    - name: 修改配置文件 
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.cnf
    - name: 修改默认首页
      tags: conf_index  #定义标签
      copy: src=index.html  dest=/var/www/html/index.html
    - name: 重启服务
      service: name=httpd state=restarted enabled=true
[root@ansible ~]# ansible-playbook user.yml -t conf_index //-t 表示 tags标签

Handlers介绍

  • handlers也是一些task的列表,和一般的task并没有什么区别。
  • 是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则-Handlers被执行
  • 不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
    在这里插入图片描述

when和register的使用

  • when的值是一个条件表达式,如果条件判断成立,这个task就执行,如果判断不成立,则task不执行
  • 在task后添加when子句即可使用条件测试
  • register用来定义一个变量,来保存变量的值
  • 可利用debug将变量里的值全部显示出来方便理解
[root@ansible ~]# uptime | awk -F, '{print $3}' | awk -F: '{print $2}'
 0.00
[root@ansible ~]# vim user.yml 
---
- name: 监控系统负载
  hosts: web1
  tasks:
    - name: 获取系统负载
      shell: "uptime | awk -F, '{print $3}' | awk -F: '{print $2}'" 
      register: result #将结果保存到result中
    - name: 停止httpd服务
      service: name=httpd state=stopped
      when: result.stdout | float > 0.7  #result.stdout意思是取出标准输出  float是将结果转为整数和0.7比较
    - debuge: var=result

验证:
[root@web1 ~]# awk ‘BEGIN{while(1){}}’ & #写个死循环触发系统负载
[root@web1 ~]# watch uptime //持续监控
[root@web1 ~]# uptime
15:03:08 up 6:28, 1 user, load average: 0.71, 0.23, 0.12
[root@ansible ~]# ansible-playbook system.yml
with_items

  • with_items是palybook标准循环
  • 用于迭代一个列表或字典,通过{{item}}获取每次迭代的值
  • 例如创建多个用户并且要求各个用户的密码不同

实例

- name: 添加多个用户
  hosts: web1
  tasks:
    - name: 添加用户 "{{item.username}}"
      user:
        name: "{{item.username}}"
        group: "{{item.group}}"
        password: "{{item.password | password_hash('sha512')}}"
      with_items:
        - 
          username: bob
          group: games
          password: '123456'
        - 
          username: kenji
          group: bin
          password: qwer123
        - 
          username: ailisi
          group: adm
          password: 123qqq...A
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章