ansible中的任务执行控制

本文介绍了Ansible中如何使用循环来创建和删除用户,并展示了通过条件判断来控制任务执行,如根据返回码判断是否执行特定任务。此外,还详细解释了如何处理任务失败的情况,包括changed_when和failed_when的使用,以及如何设置任务的错误处理流程,确保即使任务失败也能执行后续操作。
摘要由CSDN通过智能技术生成

1、ansible中的循环

[root@foundation50 .ansible]# vim westos.yml
  1 ---
  2 - name: create user
  3   hosts: 172.25.254.100
  4   tasks:
  5     - name: create user
  6       user:
  7         name: "{{item}}"    item迭代变量名称,表示取loop里面user1,user2,user3某一个,loop里面有几个直,他就取几次
  8         state: present                                                      
  9        loop:        loop表示赋值表, oop会取user1,user2,user3三个直
 10          - user1
 11          - user2
 12          - user3
[root@foundation50 .ansible]# ansible-playbook westos.yml 

PLAY [create user] ***********************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [172.25.254.100]

TASK [create user] ***********************************************************************************************
changed: [172.25.254.100] => (item=user1)   依次循环成功
changed: [172.25.254.100] => (item=user2)
changed: [172.25.254.100] => (item=user3)        
[root@node1 ~]# id user1
uid=6671(user1) gid=6671(user1) groups=6671(user1)   用户建立成功
[root@node1 ~]# id user2 
uid=6672(user2) gid=6672(user2) groups=6672(user2)  用户建立成功
[root@node1 ~]# id user3
uid=6673(user3) gid=6673(user3) groups=6673(user3)  用户建立成功


[root@foundation50 .ansible]# vim westos.yml
  1 ---
  2 - name: create user
  3   hosts: 172.25.254.100
  4   tasks:
  5     - name: create user
  6       user:
  7         name: "{{item}}"
  8         state: absent      删除用户                                                                       
  9       loop:
 10         - user1
 11         - user2
 12         - user3
[root@foundation50 .ansible]# ansible-playbook westos.yml   

循环散列或字典列表

[root@foundation50 .ansible]# vim westos.yml   多个元素的迭代循环
---
- name: create user
  hosts: 172.25.254.100
  tasks:
    - name: create user
      user:
        name: "{{item['name']}}"
        uid: "{{item['uid']}}"
        state: present
      loop:
        - name: user1    字典列表,两个元素
          uid: 2000
        - name: user2
          uid: 3000
        - name: user3
          uid: 4000

[root@foundation50 .ansible]# ansible-playbook westos.yml 
[root@node1 ~]# id user1   
uid=2000(user1) gid=6671(user1) groups=6671(user1)
[root@node1 ~]# id user2
uid=3000(user2) gid=3000(user2) groups=3000(user2)
[root@node1 ~]# id user3
uid=4000(user3) gid=4000(user3) groups=4000(user3)

2、ansible中的条件判断

在这里插入图片描述
在这里插入图片描述

[root@foundation50 .ansible]# vim westos.yml 
---
- name: test
  hosts: 172.25.254.100
  tasks:
    - name: ping
      shell:
        ping -c1 -w1 172.25.254.300
      ignore_errors: yes   表示如果报错,可以跳过继续执行,不会中断
      register: WESTOS 组册变量
    - debug:
        msg: host  is up
      when: WESTOS.rc == 0     当rc等于0,msg就不会执行

[root@foundation50 .ansible]# ansible-playbook westos.yml 

PLAY [test] ******************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [172.25.254.100]

TASK [ping] ******************************************************************************************************
fatal: [172.25.254.100]: FAILED! => {"changed": true, "cmd": "ping -c1 -w1 172.25.254.300", "delta": "0:00:00.006348", "end": "2021-11-25 22:25:20.049234", "msg": "non-zero return code", "rc": 2, "start": "2021-11-25 22:25:20.042886", "stderr": "ping: 172.25.254.300: Name or service not known", "stderr_lines": ["ping: 172.25.254.300: Name or service not known"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [debug] *****************************************************************************************************
skipping: [172.25.254.100]      ping不同msg就不执行了

PLAY RECAP *******************************************************************************************************
172.25.254.100             : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0

[root@foundation50 .ansible]# vim westos.yml 
---
- name: test
  hosts: 172.25.254.100
  tasks:
    - name: ping
      shell:
        ping -c1 -w1 172.25.254.300
      ignore_errors: yes   表示如果报错,可以跳过继续执行,不会中断
      register: WESTOS 组册变量
    - debug:
        msg: host  is up
      when: WESTOS.rc == 0     当rc等于0,msg就不会执行
  - debug:
       msg: host is down
      when: WESTOS.rc != 0  当rc不等于0,msg就会执行
[root@foundation50 .ansible]# ansible-playbook westos.yml 

PLAY [test] ******************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [172.25.254.100]

TASK [ping] ******************************************************************************************************
fatal: [172.25.254.100]: FAILED! => {"changed": true, "cmd": "ping -c1 -w1 172.25.254.300", "delta": "0:00:00.006149", "end": "2021-11-25 22:30:55.945330", "msg": "non-zero return code", "rc": 2, "start": "2021-11-25 22:30:55.939181", "stderr": "ping: 172.25.254.300: Name or service not known", "stderr_lines": ["ping: 172.25.254.300: Name or service not known"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [debug] *****************************************************************************************************
skipping: [172.25.254.100]

TASK [debug] *****************************************************************************************************
ok: [172.25.254.100] => {
    "msg": "host is down"      msg会执行
}

PLAY RECAP *******************************************************************************************************
172.25.254.100             : ok=3    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=1   


[root@foundation50 .ansible]# vim westos.yml 
---
- name: test
  hosts: 172.25.254.100
  tasks:
    - debug:
        msg: vdb  is exist
      when: ansible_facts['devices']['vdb'] is defined     vba被定义,变量存在,则取vdb  is exist
      
    - debug:
        msg: vdb is not exit
      when: ansible_facts['devices']['vdb'] is not defined  vdb没有被定义,变量不存在,则取vdb is not exit

[root@foundation50 .ansible]# ansible-playbook westos.yml   

PLAY [test] *******************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [172.25.254.100]

TASK [debug] ******************************************************************************************************************
skipping: [172.25.254.100]

TASK [debug] ******************************************************************************************************************
ok: [172.25.254.100] => {
    "msg": "vdb is not exit"   vdb不存在则取vdb is not exit
}

PLAY RECAP ********************************************************************************************************************
172.25.254.100             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

root@foundation50 .ansible]# vim westos.yml
 1 ---
  2 - name: test
  3   hosts: westos
  4   tasks:
  5     - debug:
  6         msg: vdb  is exist
  7       when:
  8         - ansible_facts['devices']['vda'] is defined
  9         - inventory_hostname is in "172.25.254.100"     表示受控主机指定为172.25.254.100,  in表示变量为的意思
 10     - debug:
 11         msg: vdb is not exit
 12       when:
 13         - ansible_facts['devices']['vda'] is not defined      表示是否存在vda设备并且指定受控主机为100,执行msg操作
 14         - inventory_hostname is in "172.25.254.100"  
[root@foundation50 .ansible]# ansible-playbook westos.yml   运行

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [172.25.254.200]
ok: [172.25.254.100]

TASK [debug] *******************************************************************
ok: [172.25.254.100] => {
    "msg": "vdb  is exist"
}
skipping: [172.25.254.200]     200没有指定,不执行

3、anisble中任务失败处理

changed_when : true 表示控制任务无论改没改,触发器都会被触发,执行后显示黄色
在这里插入图片描述
fiaild_when " ‘hello’ in TEST.stdout "当符合任务条件时无论执行成功或不成功都会报错
在这里插入图片描述

在这里插入图片描述

示例:
[root@foundation50 .ansible]# cat westos1.yml 
---
- name: test
  hosts: westos
  tasks: 
  - name: check vg
    debug:
      msg: vg westos is not exist
    when: ansible_facts['lvm']['vgs']['westos'] is not defined  

  - name: create lv
    lvol:
      vg: westos
      lv: exam_lvm
      size: 1500m
    when: ansible_facts['lvm']['vgs']['westos'] is defined  
    ignore_errors: yes
    register: LAG_LVM

  - name: create 800 lv 
    lvol:
      vg: westos
      lv: exam_lvm
      size: 800m
    when:
      - ansible_facts['lvm']['vgs']['westos'] is defined
      - LAG_LVM.rc != 0
    ignore_errors: yes
    register: SMALL_LVM

[root@foundation50 .ansible]# cat westos1.yml 
---
- name: test
  hosts: westos
  tasks:
  - name: create lvm
    block:                  如果block不能执行
    - name: create 1500 lv
      lvol:
        vg: westos
        lv: exam_lvm
        size: 1500m
      when: ansible_facts['lvm']['vgs']['westos'] is defined

    rescue:             就执行rescue
    - name: create 800 lv 
      lvol:
        vg: westos
        lv: exam_lvm
        size: 800m
      when:  ansible_facts['lvm']['vgs']['westos'] is defined

    always:          如果block和rescue不管那个不能执行,always都会执行
    - debug:
        msg: vg westos is not exist
      when: ansible_facts['lvm']['vgs']['westos'] is not defined
[root@foundation50 .ansible]# ansible-playbook westos1.yml 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小莫细说linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值