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的系统 进行了忽略执行。