Ansible 自动化运维:Playbook 编写与流程控制

Ansible 自动化运维:Playbook 编写与流程控制

1.playbook

1、使用debug模块,显示当前受管主机的dns服务器的ip地址

1.执行方法

bash 复制代码
[devops@master chap03]$ vim zy1.yml
---
- name: display dns ip
  hosts: all
  tasks:
    - name: display dns  ip
      debug:
        msg: "当前主机{{ inventory_hostname }}的dns服务器地址为: {{ ansible_facts.dns.nameservers }}"

2.执行效果

bash 复制代码
[devops@master chap03]$ ansible-playbook zy1.yml 

PLAY [display dns ip] ***********************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [node01]
ok: [master]
ok: [node02]

TASK [display dns  ip] **********************************************************************************
ok: [node02] => {
    "msg": "当前主机node02的dns服务器地址为: ['114.114.114.114']"
}
ok: [master] => {
    "msg": "当前主机master的dns服务器地址为: ['114.114.114.114']"
}
ok: [node01] => {
    "msg": "当前主机node01的dns服务器地址为: ['114.114.114.114']"
}

PLAY RECAP **********************************************************************************************
master                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node01                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2、将example.conf文件复制到/etc/httpd/conf.d/目录,如果/etc/httpd/conf.d/目录下的文件更新,则重启httpd服务

1.执行方法

bash 复制代码
[devops@master chap03]$ vim  zy2.yml
---
- name: httpd
  hosts: all
  tasks:
    - name: copy example.conf
      copy:
        src: ./example.conf
        dest: /etc/httpd/conf.d/example.conf
        mode: '0644'
      notify: restart_httpd

  handlers:
    - name: restart_httpd
      service:
        name: httpd
        state: restarted

2.执行效果

bash 复制代码
[devops@master chap03]$ ansible-playbook zy2.yml 

PLAY [httpd] **********************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [node01]
ok: [master]
ok: [node02]

TASK [copy example.conf] **********************************************************************************
changed: [master]
changed: [node01]
changed: [node02]

RUNNING HANDLER [restart_httpd] ***************************************************************************
changed: [node01]
changed: [master]
changed: [node02]

PLAY RECAP ************************************************************************************************
master                     : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node01                     : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node02                     : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

3、向受管主机的/home/file文件里面写入内容如下:

bash 复制代码
hostname=当前主机的名字
memory=当前主机的内存大小
BIOS version=当前主机的bios的版本
distribution=当前linux主机的发行版本信息
Size of disk device is 当前主机的磁盘大小

1.执行方法

bash 复制代码
[devops@master chap03]$ vim  zy3.yml 
---
- name: write /home/file
  hosts: all
  tasks:
    - name: write
      copy:
        content: |
          hostname={{ ansible_facts.hostname }}
          memory={{ ansible_facts.memtotal_mb }} MB
          BIOS version={{ ansible_facts.bios_version }}
          distribution={{ ansible_facts.distribution }} {{ ansible_facts.distribution_version }}
          Size of disk device is {{ ansible_facts.devices.sda.size }}
        dest: /home/file
        mode: '0644'

2.执行效果

bash 复制代码
[devops@master chap03]$ ansible-playbook zy3.yml 

PLAY [write /home/file] ***********************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [node02]
ok: [master]
ok: [node01]

TASK [write] **********************************************************************************************
changed: [master]
changed: [node01]
changed: [node02]

PLAY RECAP ************************************************************************************************
master                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node01                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node02                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

2.templates

1.使用file.j2模板文件向受管主机的/home/file文件里面写入内容如下:

bash 复制代码
hostname=当前主机的名字
memory=当前主机的内存大小
BIOS version=当前主机的bios的版本
distribution=当前linux主机的发行版本信息
Size of disk device is 当前主机的磁盘的大小

1.执行方法

bash 复制代码
[devops@master chap03]$ vim file.j2
hostname={{ ansible_facts.hostname }}
memory={{ ansible_facts.memtotal_mb }} MB
BIOS version={{ ansible_facts.bios_version }}
distribution={{ ansible_facts.distribution }} {{ ansible_facts.distribution_version }}
Size of disk device is {{ ansible_facts.devices.sda.size }}
[devops@master chap03]$ vim zy4.yml
---
- name: write
  hosts: all
  tasks:
    - name: write
      ansible.builtin.template:
          src: ./file.j2
          dest: /home/file

2.执行效果

bash 复制代码
[devops@master chap03]$ ansible-playbook zy4.yml 

PLAY [write] **********************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [master]
ok: [node01]
ok: [node02]

TASK [write] **********************************************************************************************
ok: [master]
ok: [node01]
ok: [node02]

PLAY RECAP ************************************************************************************************
master                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node01                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

3.ansible流程控制

1、如果当前受管主机的根分区容量大于1G,则安装httpd和mariadb-server软件包,如果httpd和 mariadb服务未运行则运行该服务。

1.执行方法

bash 复制代码
[devops@master chap03]$ vim zy5.yml
---
- name: check
  hosts: all
  gather_facts: true
  become: true
  tasks:
    - block:
        - name: install
          dnf:
            name:
              - httpd
              - mariadb-server
            state: present

        - name: run httpd
          service:
            name: httpd
            state: started
            enabled: true

        - name: run mariadb
          service:
            name: mariadb
            state: started
            enabled: true
      when: ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_total') | list | first / 1024 / 1024 > 1

2.执行效果

bash 复制代码
[devops@master chap03]$ ansible-playbook zy5.yml 

PLAY [check] **********************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [master]
ok: [node01]
ok: [node02]

TASK [install] ********************************************************************************************
changed: [node02]
changed: [master]
changed: [node01]

TASK [run httpd] ******************************************************************************************
changed: [master]
changed: [node01]
changed: [node02]

TASK [run mariadb] ****************************************************************************************
changed: [node02]
changed: [master]
changed: [node01]

PLAY RECAP ************************************************************************************************
master                     : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node01                     : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node02                     : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2、创建一个playbook,要求如下: 该playbook运行在所有受控节点 该playbook覆盖/etc/message文件的内容 在dev主机组的主机上,内容是:Development 在test主机组的主机上,内容是:Test

1.执行方法

bash 复制代码
[devops@master chap03]$ vim zy6.yml
---
- name: cover
  hosts: all
  tasks:
    - name: input Development
      copy:
        content: Development
        dest: /etc/message
      when: inventory_hostname in groups.webservers

    - name: input Test
      copy:
        content: Test
        dest: /etc/message
      when: inventory_hostname in groups.dbservers

2.执行效果

bash 复制代码
[devops@master chap03]$ ansible-playbook zy6.yml 

PLAY [cover] **********************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [node01]
ok: [master]
ok: [node02]

TASK [input Development] **********************************************************************************
skipping: [node01]
skipping: [node02]
changed: [master]

TASK [input Test] *****************************************************************************************
skipping: [master]
changed: [node02]
changed: [node01]

PLAY RECAP ************************************************************************************************
master                     : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
node01                     : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
node02                     : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0