Ansible-playbook的逻辑控制 ①

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


shell、Python等都有逻辑控制,Ansible也不例外,也有自己的逻辑控制语句,如:

when:条件判断语句,类似于shell中的if;

loop:循环语句,类似于 shell中的while;

block:把几个任务组成一个代码块,以便于针对一组操作的异常进行处理等操作。

when判断

1. 基于facts变量的条件

1.1 基于单个条件判断

例如,在下面的例子中,如果test组里面有指定的IP,就将信息打印出来:

[root@test101 ansible-test]# cat when-test1.yaml 
---
- hosts: test
  remote_user: root
  #gather_facts: no
  tasks:
    - name: test of when
      debug:
        msg: "Host 10.0.0.102 is in the test group"
      when: ansible_default_ipv4.address == "10.0.0.102"
[root@test101 ansible-test]#

执行结果:

1.2 基于多个条件判断

例如下面的例子,如果远端主机是x86_64,且IP是指定IP,则执行reboot。满足的两个条件可以按照写法一种用and连接,也可以按照写法二中用将条件罗列出来。

[root@test101 ansible-test]# cat when-test2.yaml 
---
- hosts: test
  remote_user: root
  #gather_facts: no
  tasks:
    - name: Restart my server
      command: /usr/sbin/reboot
      ## 写法一:
      ##when: ansible_default_ipv4.address == "10.0.0.103" and ansible_architecture ==  "x86_64"
      ## 写法2
      when:
        - ansible_architecture == "x86_64"
        - ansible_default_ipv4.address == "10.0.0.103"
[root@test101 ansible-test]# 

执行结果:

如果满足的多个条件之间的关系不是and,而是“或者”的关系,则可以这样写:

[root@test101 ansible-test]# cat when-test3.yaml 
---
- hosts: test
  remote_user: root
  #gather_facts: no
  tasks:
    - name: Restart my server
      command: /usr/sbin/reboot
      ## 写法一:
      # when: ansible_default_ipv4.address == "10.0.0.103" or ansible_architecture ==  "x86_64"
      ## 写法二:
      when: >
        ansible_architecture == "x86_64"
        or
        ansible_default_ipv4.address == "10.0.0.103"
[root@test101 ansible-test]# 

执行结果:

如果条件中既包含and关系,也包含or的关系,则可以这样写:

[root@test101 ansible-test]# cat when-test4.yaml
---
- hosts: test
  remote_user: root
  #gather_facts: no
  tasks:
    - name: Restart my server
      command: /usr/sbin/reboot
      ## 写法一:
      #when: (ansible_default_ipv4.address == "10.0.0.102" and ansible_architecture ==  "x86_64") or (ansible_default_ipv4.address == "10.0.0.103" and ansible_architecture ==  "x86_64")
      ## 写法二:
      when: >
        (ansible_default_ipv4.address == "10.0.0.102" and ansible_architecture ==  "x86_64")
        or
        (ansible_default_ipv4.address == "10.0.0.103" and ansible_architecture ==  "x86_64")
[root@test101 ansible-test]#

2. 基于Action执行结果的条件

例如,判断远程主机是否存在/tmp/test.txt这个文件,如果存在,则打出存在该文件的主机IP:

[root@test101 ansible-test]# cat when-test5.yaml 
---
- name: test of when
  hosts: test
  tasks:
    - name: Check if a file exists
      stat:
        path: /tmp/test.txt
      register: file_check_result
    
    - name: Perform action based on file existence
      debug:
        msg: "File exists on  {{ ansible_host }}"
      when: file_check_result.stat.exists
[root@test101 ansible-test]#

执行结果:

3. 其它使用场景

when还可以与with_items共用,用于简单的数字判断:

[root@test101 ansible-test]# cat when-test6.yaml 
---
- hosts: test
  gather_facts: no
  tasks:
    - name: test of when
      #command: echo {{ item }}
      debug:
        msg: item is {{ item }}
      with_items: [ 0, 3, 5, 8, 10, 26 ]
      when: item > 6
[root@test101 ansible-test]#

执行结果:

未完待续......

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值