RHCE8.0实训:编写循环和条件任务

来自CloudWiki
跳转至: 导航搜索

实训任务

  • 使用when关键字实施Ansible条件。
  • 结合使用loop关键字和条件实施任务迭代。

实训步骤

[root@servera ansible]# mkdir control-flow

[root@servera ansible]# cd control-flow/


清单文件

vi /etc/ansible/hosts

[database_dev]
servera.lab.example.com
[database_prod]
serverb.lab.example.com

vi /etc/hosts

10.0.0.30 servera.lab.example.com
10.0.0.32 serverb.lab.example.com

编辑主控组play

vi playbook.yml

---
  - name: MariaDB server is running
    hosts: database_dev
    vars:
      mariadb_packages:
          - mariadb-server
          - python3-PyMySQL
    tasks:
      - name: MariaDB packages are installed
        yum:
          name: "{{ item }}"
          state: present
        loop: "{{ mariadb_packages }}" 
      - name: Start MariaDB service
        service:
          name: mariadb
          state: started
          enabled: true

ansible-playbook playbook.yml

PLAY [MariaDB server is running] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [servera.lab.example.com]

TASK [MariaDB packages are installed] ******************************************
changed: [servera.lab.example.com] => (item=mariadb-server)
failed: [servera.lab.example.com] (item=python3-PyMySQL) => {"ansible_loop_var": "item", "changed": false, "item": "python3-PyMySQL", "msg": "No package matching 'python3-PyMySQL' found available, installed or updated", "rc": 126, "results": ["No package matching 'python3-PyMySQL' found available, installed or updated"]}

PLAY RECAP *********************************************************************
servera.lab.example.com    : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

编辑受控组play

更新第一个任务,使其仅在受管主机将红帽企业Linux用作其操作系统时才执行。更新play 以使用database_prod主机组。该任务应当如下所示

vi playbook-1.yml

---
  - name: MariaDB server is running
    hosts: database_prod
    vars:
      mariadb_packages:
          - mariadb-server
          - python3-PyMySQL
    tasks:
      - name: MariaDB packages are installed
        yum:
          name: "{{ item }}"
          state: present
        loop: "{{ mariadb_packages }}" 
        when: ansible_distribution == "RedHat"
      - name: Start MariaDB service
        service:
          name: mariadb
          state: started
          enabled: true

验证database_prod主机组中的受管主机是否将红帽企业Linux用作其操作系统。

[root@localhost control-flow]# ansible database_prod -m command -a 'cat /etc/redhat-release'

serverb.lab.example.com | CHANGED | rc=0 >>
CentOS Linux release 7.7.1908 (Core)

再次运行playbook,并观察play的输出。

[student@workstation control-flow]$ ansible-playbook playbook-1.yml

 

PLAY [MariaDB server is running] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [serverb.lab.example.com]

TASK [MariaDB packages are installed] ******************************************
skipping: [serverb.lab.example.com] => (item=mariadb-server)
skipping: [serverb.lab.example.com] => (item=python3-PyMySQL)

TASK [Start MariaDB service] ***************************************************
fatal: [serverb.lab.example.com]: FAILED! => {"changed": false, "msg": "Could not find the requested service mariadb: host"}

PLAY RECAP *********************************************************************
serverb.lab.example.com    : ok=1    changed=0    unreachable=0    failed=1    skipped=1    rescued=0    ignored=0

可见 添加了when条件后 ,对于非redhat的系统 进行了忽略执行。