天碰到一个需求,当使用ansible-playbook在执行一个脚本后,根据脚本返回的内容判断是否继续往下执行还是中断执行,查询官网发现使用register寄存器可以实现记录stdout输出,使用when+fail模块来判断是否往下继续执行或者中断,以下是一个简单例子:

    1. tasks:
    2. - name: check
    3. #当结果返回1时表示未删除,执行删除步骤
    4. shell: if [ `rpm -qa | grep zabbix | wc -l` -eq 0 ]; then echo 0; else echo 1; fi;
    5. register: result
    6. ignore_errors: True
    7. - name: remove zabbix-agent
    8. command: rpm -evh zabbix-agent-5.0.20-1.el7.x86_64
    9. when: 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 条件所以跳过后续步骤。