天碰到一个需求,当使用ansible-playbook在执行一个脚本后,根据脚本返回的内容判断是否继续往下执行还是中断执行,查询官网发现使用register寄存器可以实现记录stdout输出,使用when+fail模块来判断是否往下继续执行或者中断,以下是一个简单例子:
tasks:- name: check#当结果返回1时表示未删除,执行删除步骤shell: if [ `rpm -qa | grep zabbix | wc -l` -eq 0 ]; then echo 0; else echo 1; fi;register: resultignore_errors: True- name: remove zabbix-agentcommand: rpm -evh zabbix-agent-5.0.20-1.el7.x86_64when: result.stdout == '1'
查看输出结果
[root@00fa353d51f8 project]# ansible-playbook -v remove.yml
Using /etc/ansible/ansible.cfg as config file
PLAY [zabbix agent remove] *****************************************************************************************************************************
TASK [check] **************************************************************************************************************************************
changed: [192.168.102.66] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "if [ `rpm -qa | grep zabbix | wc -l` -eq 0 ]; then echo 0; else echo 1; fi;", "delta": "0:00:01.183743", "end": "2022-02-10 16:37:05.644520", "rc": 0, "start": "2022-02-10 16:37:04.460777", "stderr": "", "stderr_lines": [], "stdout": "1", "stdout_lines": ["1"]}
changed: [192.168.102.67] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "if [ `rpm -qa | grep zabbix | wc -l` -eq 0 ]; then echo 0; else echo 1; fi;", "delta": "0:00:01.219444", "end": "2022-02-10 16:37:05.680490", "rc": 0, "start": "2022-02-10 16:37:04.461046", "stderr": "", "stderr_lines": [], "stdout": "1", "stdout_lines": ["1"]}
TASK [remove zabbix-agent] *****************************************************************************************************************************
[WARNING]: Consider using the yum, dnf or zypper module rather than running 'rpm'. If you need to use command because yum, dnf or zypper is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.102.67] => {"changed": true, "cmd": ["rpm", "-evh", "zabbix-agent-5.0.20-1.el7.x86_64"], "delta": "0:00:00.622647", "end": "2022-02-10 16:37:06.831845", "rc": 0, "start": "2022-02-10 16:37:06.209198", "stderr": "warning: /etc/zabbix/zabbix_agentd.conf saved as /etc/zabbix/zabbix_agentd.conf.rpmsave", "stderr_lines": ["warning: /etc/zabbix/zabbix_agentd.conf saved as /etc/zabbix/zabbix_agentd.conf.rpmsave"], "stdout": "Preparing... ########################################\nCleaning up / removing...\nzabbix-agent-5.0.20-1.el7 ########################################", "stdout_lines": ["Preparing... ########################################", "Cleaning up / removing...", "zabbix-agent-5.0.20-1.el7 ########################################"]}
changed: [192.168.102.66] => {"changed": true, "cmd": ["rpm", "-evh", "zabbix-agent-5.0.20-1.el7.x86_64"], "delta": "0:00:00.659936", "end": "2022-02-10 16:37:06.839243", "rc": 0, "start": "2022-02-10 16:37:06.179307", "stderr": "warning: /etc/zabbix/zabbix_agentd.conf saved as /etc/zabbix/zabbix_agentd.conf.rpmsave", "stderr_lines": ["warning: /etc/zabbix/zabbix_agentd.conf saved as /etc/zabbix/zabbix_agentd.conf.rpmsave"], "stdout": "Preparing... ########################################\nCleaning up / removing...\nzabbix-agent-5.0.20-1.el7 ########################################", "stdout_lines": ["Preparing... ########################################", "Cleaning up / removing...", "zabbix-agent-5.0.20-1.el7 ########################################"]}
PLAY RECAP *********************************************************************************************************************************************
192.168.102.66 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.102.67 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
register 保存的信息就是“=>”后面的内容,这些信息保存到result这个变量中。stdout为标准输出。我们就可以利用stdout 的结果来结合when来做判断,是否执行后面的playbook。可以在 TASK [check] 看到 stdout 为 1 所以执行后续步骤。
再次执行
[root@00fa353d51f8 project]# ansible-playbook -v remove.yml
Using /etc/ansible/ansible.cfg as config file
PLAY [zabbix agent remove] *****************************************************************************************************************************
TASK [check prot] **************************************************************************************************************************************
changed: [192.168.102.66] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "if [ `rpm -qa | grep zabbix | wc -l` -eq 0 ]; then echo 0; else echo 1; fi;", "delta": "0:00:01.088755", "end": "2022-02-10 16:37:16.546216", "rc": 0, "start": "2022-02-10 16:37:15.457461", "stderr": "", "stderr_lines": [], "stdout": "0", "stdout_lines": ["0"]}
changed: [192.168.102.67] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "if [ `rpm -qa | grep zabbix | wc -l` -eq 0 ]; then echo 0; else echo 1; fi;", "delta": "0:00:01.250322", "end": "2022-02-10 16:37:16.736254", "rc": 0, "start": "2022-02-10 16:37:15.485932", "stderr": "", "stderr_lines": [], "stdout": "0", "stdout_lines": ["0"]}
TASK [remove zabbix-agent] *****************************************************************************************************************************
skipping: [192.168.102.66] => {"changed": false, "skip_reason": "Conditional result was False"}
skipping: [192.168.102.67] => {"changed": false, "skip_reason": "Conditional result was False"}
PLAY RECAP *********************************************************************************************************************************************
192.168.102.66 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.102.67 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
这一次 TASK [check] 的 stdout 为 1 不符合 when 条件所以跳过后续步骤。
