playbook控制语句

本章主要介绍 playbook中的控制语句。

目录

判断语句when 

 (1)when判断中>、<、!=的使用 

(2)when判断中in的用法 

(3)when判断中is的用法 

判断语句block-rescue 

循环语句 


一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个条件才执行这个task,不满足条件则不执行此task。本章主要讲解when 和 block-rescue两种判断语句。


判断语句when 

when作为一个判断语句,出现在某个 task下,格式如下。 

tasks:

‐ name: aa

  模块1

  when: 条件1 

如果条件1成立,则执行模块1,否则不执行。 

注意:在when中引用变量时是不用加{{}}的。 

本章实验都在/home/duan/demo3下操作,先把demo3目录创建出来并把ansible.cfg 和 hosts拷贝进去,命令如下。 

[bdqn@rhel01 ~]$ mkdir demo3
[bdqn@rhel01 ~]$ cp ansible.cfg hosts demo3/
[bdqn@rhel01 ~]$ cd demo3/
[bdqn@rhel01 demo3]$ ls
ansible.cfg  hosts
[bdqn@rhel01 demo3]$ 

 (1)when判断中>、<、!=的使用 

写一个playbook,判断某条件是否成立,成立了才执行task,否则不执行,命令如下。 

[bdqn@rhel01 demo3]$ cat 1.yaml 
---
- hosts: server2
  tasks:
  - name: tasks1
    debug: msg="111"
    when: 1<2
[bdqn@rhel01 demo3]$ 

这里有一个task,判断1<2是否成立,如果成立则执行task1,屏幕上会显示111;如果不成立则不执行taskl,屏幕上不会显示111。这里明显是成立的,所以会执行task1。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 1.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [tasks1] *********************************************************************************************************************************************
ok: [server2] => {
    "msg": "111"
}

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

[bdqn@rhel01 demo3]$ 

when后面可以有多个条件,用or或and作为连接符。 

如果用or作为连接符,只要有一个条件成立即可,只有所有的条件都不成立时,整体才不成立。 

修改1.yaml的内容如下。 

[bdqn@rhel01 demo3]$ cat 1.yaml 
---
- hosts: server2
  tasks:
  - name: tasks1
    debug: msg="111"
    when: 1<2 or 2>3
[bdqn@rhel01 demo3]$ 

此处用or作为连接符,只要有一个条件成立就会成立,2>3不成立,但是1<2成立,所以整体上就是成立的。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 1.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [tasks1] *********************************************************************************************************************************************
ok: [server2] => {
    "msg": "111"
}

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

[bdqn@rhel01 demo3]$ 

仍然会执行task1。 

修改1.yaml的内容如下。 

[bdqn@rhel01 demo3]$ cat 1.yaml 
---
- hosts: server2
  tasks:
  - name: tasks1
    debug: msg="111"
    when: 1>2 or 2>3
[bdqn@rhel01 demo3]$

此处用or作为连接符,1>2不成立且2>3也不成立,所以整体上就是不成立的,不会执行 task1。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 1.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [tasks1] *********************************************************************************************************************************************
skipping: [server2]

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

[bdqn@rhel01 demo3]$ 

也可以用and作为连接符,如果用and作为连接符,需要所有条件全部成立,只要有一个条件不成立,整体上就是不成立的。 

修改1.yaml的内容如下。 

[bdqn@rhel01 demo3]$ cat 1.yaml 
---
- hosts: server2
  tasks:
  - name: tasks1
    debug: msg="111"
    when: 2>1 and 2>3
[bdqn@rhel01 demo3]$

这里虽然2>1是成立的,但是2>3不成立,所以整体上就是不成立的,因为用and作为连接符,需要所有的条件都成立才可以,所以不会执行task1。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 1.yaml 

PLAY [server2] **********************************************************************************************************************************************

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

TASK [tasks1] ***********************************************************************************************************************************************
skipping: [server2]

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

[bdqn@rhel01 demo3]$

在判断中,or 和 and是可以混用的,为了看得更清晰,可以使用小括号。 

修改1.yaml 的内容如下。 

[bdqn@rhel01 demo3]$ cat 1.yaml 
---
- hosts: server2
  tasks:
  - name: tasks1
    debug: msg="111"
    when: (1>2 or 2!=1) and 2>3
[bdqn@rhel01 demo3]$ 

这里(1>2 or 2!=1)作为一个整体,1>2不成立,但是2!=1(=是不等于的意思)成立,所以 此处( 1>2 or 2!=1)作为一个整体是成立的。and后面2>3不成立,所以整个when后面的判断是不成立的,不会执行此 task1。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 1.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [tasks1] *********************************************************************************************************************************************
skipping: [server2]

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

[bdqn@rhel01 demo3]$ 

常见的判断符包括以下6种。

  1. ==:等于。
  2. !=:不等于。
  3. >:大于。
  4. >=:大于等于。
  5. <:小于。
  6. <=:小于等于。 

如果server2的系统主版本是7(RHEL/CentOS7),则打印111,否则不打印。 playbook的内容如下。 

[bdqn@rhel01 demo3]$ cat 2.yaml 
---
- hosts: server2
  tasks:
  - name: task2
    debug: msg="111"
    when: ansible_distribution_major_version == "7"
[bdqn@rhel01 demo3]$

因为server2的系统是RHEL8,所以不会执行此task2,即不会显示111。 

[bdqn@rhel01 demo3]$ ansible-playbook 2.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task2] **********************************************************************************************************************************************
skipping: [server2]

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

[bdqn@rhel01 demo3]$

注意:ansible_distribution major version的值是一个字符串,所以when判断中=后面的7是要加引号 的。 

修改2.yaml 的内容如下。 

[bdqn@rhel01 demo3]$ cat 2.yaml 
---
- hosts: server2
  tasks:
  - name: task2
    debug: msg="111"
    when: ansible_distribution_major_version == "8"
[bdqn@rhel01 demo3]$ 

再次运行此playbook,命令如下,会显示111。 

[bdqn@rhel01 demo3]$ ansible-playbook 2.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task2] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "111"
}

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

[bdqn@rhel01 demo3]$

再次提醒:在when 中引用变量时是不用加{{}}的。 


(2)when判断中in的用法 

在when语句中,除可以使用上面的大于、小于等判断方法外,还可以使用 in,用法如下。

value in 列表 

如果此值在这个列表中,则判断成立,否则不成立。 

判断某值是否在列表中,编写3.yaml,命令如下。 

[bdqn@rhel01 demo3]$ cat 3.yaml 
---
- hosts: server2
  vars:
    list1: [1,2,3,4]
  tasks:
  - name: task3
    debug: msg="333"
    when: 2 in list1
[bdqn@rhel01 demo3]$ 

此处定义了一个列表 list1,里面有4个值,分别为1、2、3、4;定义了一个task打印333, 会不会执行这个task,就要看when后面的判断是否成立。如果2在列表list1中,则执行;如果不在,则不执行,很明显2在列表list1中,所以会执行此task,即屏幕上会显示333。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 3.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task3] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "333"
}

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

[bdqn@rhel01 demo3]$ 

因为2在列表list1中,when判断成立,可以正确执行task3,所以屏幕上会显示333。修改3.yaml的内容如下。 

[bdqn@rhel01 demo3]$ cat 3.yaml 
---
- hosts: server2
  vars:
    list1: [1,2,3,4]
  tasks:
  - name: task3
    debug: msg="333"
    when: 2 not in list1
[bdqn@rhel01 demo3]$

这里判断的是2不在列表list1中,但2是在列表list1中的,所以判断不成立。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 3.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task3] **********************************************************************************************************************************************
skipping: [server2]

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

[bdqn@rhel01 demo3]$ 

因为when判断不成立,所以屏幕上不会显示333。


(3)when判断中is的用法 

is可以用于判断变量是否被定义,常见的判断包括以下3种。

  1. is defined:变量被定义。
  2. is undefined:等同于is not defined,变量没有被定义。
  3. is none:变量被定义了,但是值为空。 

看下面的例子。 

[bdqn@rhel01 demo3]$ cat 4.yaml 
---
- hosts: server2
  vars:
    aa: 1
    bb:
  tasks:
  - name: task1
    debug: msg="111"
    when: aa is undefined
  - name: task2
    debug: msg="222"
    when: bb is undefined
  - name: task3
    debug: msg="333"
    when: cc is not defined
[bdqn@rhel01 demo3]$ 

首先定义了两个变量:aa和 bb,其中bb的值为空,此处并没有定义cc。后面定义了以下 3个task。 

如果aa没有被定义,则显示111,这里aa被定义了,所以判断不成立,不会执行task1。

如果bb没有被定义,则显示222,这里bb被定义了,所以判断不成立,不会执行 task2。

如果cc没有被定义,则显示333,这里cc没有被定义,所以判断成立,会执行 task3。 

这里is undefined 和is not defined是一个意思。 

查看运行的结果,如下所示。 

[bdqn@rhel01 demo3]$ ansible-playbook 4.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task1] **********************************************************************************************************************************************
skipping: [server2]

TASK [task2] **********************************************************************************************************************************************
skipping: [server2]

TASK [task3] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "333"
}

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

[bdqn@rhel01 demo3]$ 

写一个playbook,内容如下 

[bdqn@rhel01 demo3]$ cat 5.yaml 
---
- hosts: server2
  tasks:
  - name: 执行一个系统命令
    shell: "ls /aa.txt"
    register: aa
    ignore_errors: yes
  - name: tssk2
    fail: msg="命令执行错了001"
    when: aa.rc != 0
  - name: task3
    debug: msg="OK123"
[bdqn@rhel01 demo3]$ 

运行此playbook命令如下 

[bdqn@rhel01 demo3]$ ansible-playbook 5.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [执行一个系统命令] *******************************************************************************************************************************************
fatal: [server2]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.003496", "end": "2023-12-22 10:50:50.785410", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 10:50:50.781914", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [tssk2] **********************************************************************************************************************************************
fatal: [server2]: FAILED! => {"changed": false, "msg": "命令执行错了001"}

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

[bdqn@rhel01 demo3]$

判断语句block-rescue 

对于when来说,只能做一个判断,成立就执行,不成立就不执行。block和rescue一般同用,类似于shell判断语句中的if-else,在block下面可以包含多个模块,来判断这多个模块是否执行成功了。 

block-rescue的用法如下。

block:

  ‐ 模块1

  ‐ 模块2

  ‐ 模块3

rescue:

  ‐ 模块1

  ‐ 模块2 

先执行 block中的模块1,如果没有报错,则继续执行模块2,如果block中的所有模块都执行成功了,则跳过rescue 中的所有模块,直接执行下一个task中的模块,如下图所示。

这里有2个task : task1和 task2,在 task1的block中有3个模块,rescue中有2个模块。 如果 block1中的所有模块都正确执行了,则不执行rescue中的模块,直接执行task2。 

如果 block中的任一模块执行失败,block中其他后续的模块都不再执行,然后会跳转执行rescue中的模块,如下图所示。

 这里block1中的模块1执行完成之后会执行模块2,如果模块2报错,则不会执行模块3, 直接跳转到rescue中,执行模块x。rescue中的所有模块全部正确执行完成之后,则执行 task2。 

如果rescue中的某个模块执行失败,则退出整个playbook,如下图所示。

这里 block中的模块2执行失败,则跳转到rescue中执行模块x,如果模块x执行失败,则退出整个 playbook,即也不会执行task2了。 

如果某个报错模块有 ignore_errors: yes选项,则会忽略此模块的错误,继续执行下一个模块,如下图所示。

 这里block中的模块2执行失败了,但是因为加了ignore_errors: yes选项,所以会忽略这个报错模块,继续执行模块3。 

按上面的描述写一个playbook,内容如下。 

[bdqn@rhel01 demo3]$ cat 6.yaml 
---
- hosts: server2
  tasks:
  - name: task1
    block:
    - name: 11
      debug: msg="111"

    - name: 22
      shell: "ls /aa.txt"

    - name: 33
      debug: msg="333"

    rescue:
    - name: xx
      debug: msg="xxx"

    - name: yy
      debug: msg="yyy"

    - name: task2
      debug: msg="zzz"
[bdqn@rhel01 demo3]$ 

这里在task1的block中运行了3个模块,第一个模块可以正确执行,第二个模块是执行一 个系统命令ls /aa.txt,但是在server2中是不存在/aa.txt这个文件的,所以这个模块会执行失败。block中的第三个模块不再执行,直接跳转到rescue中的模块。rescue中的2个模块均可正确执行,然后执行task2。 

所以,屏幕上会显示1111, xxxx, yyyy, zzzz。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 6.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [debug] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "111"
}

TASK [shell] **********************************************************************************************************************************************
fatal: [server2]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.004160", "end": "2023-12-22 11:05:48.598107", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 11:05:48.593947", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}

TASK [xx] *************************************************************************************************************************************************
ok: [server2] => {
    "msg": "xxx"
}

TASK [yy] *************************************************************************************************************************************************
ok: [server2] => {
    "msg": "yyy"
}

TASK [task2] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "zzz"
}

PLAY RECAP ************************************************************************************************************************************************
server2                    : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

[bdqn@rhel01 demo3]$ 

修改6.yaml的内容如下。

[bdqn@rhel01 demo3]$ cat 6.yaml 
---
- hosts: server2
  tasks:
  - name: task1
    block:
    - name: 11
      debug: msg="111"

    - name: 22
      shell: "ls /aa.txt"
      ignore_errors: yes

    - name: 33
      debug: msg="333"

    rescue:
    - name: xx
      debug: msg="xxx"

    - name: yy
      debug: msg="yyy"

    - name: task2
      debug: msg="zzz"
[bdqn@rhel01 demo3]$ 

与上面的例子相比,在 block的第二个模块中增加了一个 ignore_errors: yes选项,这样 block中的第二个模块即使报错了,也会忽略这个报错继续执行第三个模块, 所以屏幕上会显示1111,3333,。运行结果如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 6.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [debug] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "111"
}

TASK [shell] **********************************************************************************************************************************************
fatal: [server2]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.003329", "end": "2023-12-22 11:08:19.248428", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 11:08:19.245099", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [debug] **********************************************************************************************************************************************
ok: [server2] => {
    "msg": "333"
}

PLAY RECAP ************************************************************************************************************************************************
server2                    : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   

[bdqn@rhel01 demo3]$ 

循环语句 

在shell中 for循环的用法如下。

for i in A B C ... ; do

  命令 $

done 

这里首先把A赋值给i,执行do和done之间的命令;然后把B赋值给i,执行do和 done之间 的命令,以此类推,直到把in后面所有的值执行完毕。for后面的变量可以随便命名。 

 再回顾一下前面介绍的列表,如下所示。

employee:

‐ uname: lisi

  age: 22

  sex: man

‐ uname: wangwu

  age: 24

  sex: man

‐ uname: xiaohua

  age: 21

这里列表employee中有3个元素,分别记录了lisi、wangwu、xiaohua的信息。我们把这3个元素当成刚讲的for循环中的A、B、C。先把第一个元素赋值给变量,执行某个操作, 完成之后再把第二个元素赋值给变量。 

用for循环A、B、C,在playbook中用loop来循环列表中的元素。在for循环中,指定一个 变量如i,然后分别把A、B、C赋值给i。 

在loop中,使用一个固定的变量 item,然后把每个元素赋值给item。第 二次循环,如下图所示。

定义一个列表users,然后循环这个列表中的每个元素,命令如下。

[bdqn@rhel01 demo3]$ cat 7.yaml 
---
- hosts: server2
  vars:
    users:
    - uname: tom
      age: 20
      sex: man
    - uname: bob
      age: 22
      sex: man
    - uname: mary
      age: 20
      sex: woman
 
  tasks:
  - name: task1
    debug: msg={{ item }}
    loop: "{{ users }}"
[bdqn@rhel01 demo3]$ 

这里定义了一个列表users,里面包含了3个用户的信息,在taskl中用loop开始循环这个 列表。loop后面写列表名时,需要使用引号引起来,这里的关键字loop可以换成关键字 with_items. 

这里首先把users的第一个元素赋值给item,用debug 打印;然后把users的第二个元素赋 值给item,用 debug打印,直到把所有的元素都赋值给 item。 

运行此 playbook,命令如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 7.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task1] **********************************************************************************************************************************************
ok: [server2] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {
    "msg": {
        "age": 20,
        "sex": "man",
        "uname": "tom"
    }
}
ok: [server2] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {
    "msg": {
        "age": 22,
        "sex": "man",
        "uname": "bob"
    }
}
ok: [server2] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) => {
    "msg": {
        "age": 20,
        "sex": "woman",
        "uname": "mary"
    }
}

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

[bdqn@rhel01 demo3]$ 

如果不想打印每个元素的所有条目,只想打印每个元素的uname呢?答案:可以。

修改7.yaml的内容如下。

[bdqn@rhel01 demo3]$ cat 7.yaml 
---
- hosts: server2
  vars:
    users:
    - uname: tom
      age: 20
      sex: man
    - uname: bob
      age: 22
      sex: man
    - uname: mary
      age: 20
      sex: woman
 
  tasks:
  - name: task1
    debug: msg={{ item.uname }}
    loop: "{{ users }}"
[bdqn@rhel01 demo3]$ 

列表的每个元素都是一个字典,所以 item就是字典,要获取这个字典中的uname变量,用 item.uname即可。

运行此 playbook,命令如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 7.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task1] **********************************************************************************************************************************************
ok: [server2] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {
    "msg": "tom"
}
ok: [server2] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {
    "msg": "bob"
}
ok: [server2] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) => {
    "msg": "mary"
}

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

[bdqn@rhel01 demo3]$ 

如果想打印所有性别为男的那些用户名,修改7.yaml 的内容如下。 

[bdqn@rhel01 demo3]$ cat 7.yaml 
---
- hosts: server2
  vars:
    users:
    - uname: tom
      age: 20
      sex: man
    - uname: bob
      age: 22
      sex: man
    - uname: mary
      age: 20
      sex: woman
 
  tasks:
  - name: task1
    debug: msg={{ item.uname }}
    when: item.sex == "man"
    loop: "{{ users }}"
[bdqn@rhel01 demo3]$

在此playbook中,我们用when加了一个判断。循环列表时,首先把第一个元素赋值给 item,然后判断item.sex的值是否为man,如果是则判断成立,执行debug模块;如果不是 则判断不成立,不执行debug模块。 

第一次循环结束之后,开始第二次循环,把第二个元素赋值给item之后,做相同的判 断。运行此 playbook,命令如下。 

[bdqn@rhel01 demo3]$ ansible-playbook 7.yaml 

PLAY [server2] ********************************************************************************************************************************************

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

TASK [task1] **********************************************************************************************************************************************
ok: [server2] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {
    "msg": "tom"
}
ok: [server2] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {
    "msg": "bob"
}
skipping: [server2] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) 

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

[bdqn@rhel01 demo3]$ 

这样就把所有性别为男的用户名打印出来了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

品牌出海如何做?海外社媒营销新趋势

社交媒体在网上的影响力是毋庸置疑的。投资社交媒体平台并建立公司形象&#xff0c;提高产品运营收入&#xff0c;提升品牌知名度&#xff0c;对于吸引对您所提供的产品感兴趣的人至关重要。 然而&#xff0c;社交媒体格局总是在变化&#xff0c;这意味着您需要掌握新的社交媒…

xposed 01 - 环境搭建

简介 Xposed的作者是rovo89&#xff0c;但是更新完 8.1 的 beta 版之后就不更新了。由于Android新版本的普及&#xff0c;目前新上市的手机基本都是8.0以上。所以Xposed框架已经不适用。EdXposed团队成为Xposed停止更新后的官方接任者。 当然现在有更好的 LSPosed https://git…

v-if与v-show的区别

v-if指令可以控制一个元素的显示和隐藏&#xff0c;那么它是如何实现的&#xff1f;它和看起来很像的v-show指令有什么区别呢&#xff1f; 如果v-if指令的值为假&#xff0c;那么这个元素不会被插入DOM。 下面的代码 <div v-if"true">one</div><div…

05-垃圾收集器ParNewCMS与底层三色标记算法详解

文章目录 垃圾收集算法分代收集理论标记-复制算法标记-清除算法标记-整理算法 垃圾收集器Serial收集器Parallel Scavenge收集器ParNew收集器CMS收集器 CMS的相关核心参数亿级流量电商系统如何优化JVM参数设置(ParNewCMS) 垃圾收集底层算法实现三色标记多标-浮动垃圾漏标-读写屏…

高级算法设计与分析(六) -- 分支限界法

系列文章目录 高级算法设计与分析&#xff08;一&#xff09; -- 算法引论 高级算法设计与分析&#xff08;二&#xff09; -- 递归与分治策略 高级算法设计与分析&#xff08;三&#xff09; -- 动态规划 高级算法设计与分析&#xff08;四&#xff09; -- 贪心算法 高级…

数字滤波器的设计

一般滤波器可以分为经典滤波器和数字滤波器。 经典滤波器&#xff1a;假定输入信号中的有用成分和希望去除的成分各自占有不同的频带。如果信号和噪声的频谱相互重迭&#xff0c;经典滤波器无能为力。比如 FIR 和 IIR 滤波器等。  现代滤波器&#xff1a;从含有噪声的时间序…

Envoy

一. Envoy ). Envoy Envoy 于 2017 年 9 月作为孵化项目加入 CNCF。从孵化到毕业&#xff0c;Envoy 都是 CNCF 增长最快的项目之一 Envoy 在吞吐量和延迟方面都表现良好。这在大型云原生部署中至关重要 Envoy 是专为大型现代 SOA&#xff08;面向服务架构&#xff09;架构设计…

python:删除空白

删除字符串末尾的空白 例如&#xff0c;下面的代码&#xff0c;变量hobby指向的字符串在末尾有一个空格&#xff1a; 可以使用函数rstrip()删除字符串末尾的空格&#xff0c;如下&#xff1a; 因为删除字符串末尾的空格并没有赋值给原变量hobby&#xff0c;所以此时查看hobb…

基于ssm房屋租赁平台的设计与开发论文

摘 要 目前对于在外的人员来说租赁房屋是最基本的问题。对于房屋的租赁可以选择直接找房东、找专业的房屋租赁公司和自己在网上找房屋。自己找房东的问题在于需要时间&#xff0c;而且对于需要提前租赁房屋的需要多次跑到小区&#xff0c;找中介租赁房屋的问题在于费用问题&am…

FPGA未解之谜

一.ila一会能加载出波形&#xff0c;一会加载不出波形——在自己做的v7开发板中遇到&#xff0c;其他开发板从未遇到过 1.小梅哥说&#xff1a;可能与硬件jtag连接不稳定导致。

CiteSpace最新安装教程

目录 一、CiteSpace特点介绍 二、CiteSpace安装教程 1、安装java 2、配置java环境变量 3、安装CiteSpace 4、运行CiteSpace 一、CiteSpace特点介绍 CiteSpace是一种用于分析学术文献的可视化工具&#xff0c;旨在帮助研究人员理解学术领域的演化、发现研究热点和趋势。 …

【Python】matplotlib画图_折线图

柱状图主要使用plot()函数&#xff0c;基本格式如下&#xff1a; plt.plot(x,y,label成功几率,colorb,marker.,ms8,mfcr,alpha0.5) 主要参数&#xff1a; x&#xff0c;y&#xff1a;xy轴数据 label&#xff1a;数据标签 color&#xff1a;折线颜色 marker&#xff1a;标…

什么是伦敦金的假突破?假突破为何有效?

部分投资者做伦敦金交易的时候喜欢追逐那些强势的行情&#xff0c;也就是我们所说的突破行情。但是突破行情会带来两种结果&#xff0c;一种是突破成功&#xff0c;而另一种是出现假突破。什么是伦敦金中的假突破呢&#xff1f;为什么假突破会有效呢&#xff1f;下面我们就来讨…

基于JAVA+SpringBoot+Vue的前后端分离的问题反馈处理平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在这个信息爆炸的时代…

【自学笔记】Python测试框架pytest

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 安装📝 编写测试函数⚓️ 相关链接 ⚓️📖 介绍 📖 pytest 是一个广泛使用的 Python 测试框架,它提供了简单、灵活和可扩展的测试功能。通过 pytest,您可以轻松地创建和运行单元测试、集成测试和功能测试…

若依框架跑起来,Java小白入门(一)

背景 本人Java小白&#xff0c;有一点编程基础&#xff08;c#&#xff09;。企业数字化建设大环境是JAVA&#xff0c;所以需要搞起来&#xff0c;而学习最快的方式就是读代码&#xff0c;学以致用干项目。所以这个系列就是从小白看能否变成小黑。码云上有很多框架&#xff0c;…

centos如何下载chrome

【环境配置】centos安装chrome浏览器_centos chrome-CSDN博客https://blog.csdn.net/tyty2211/article/details/134511154亲测有效&#xff1a;

ssm420基于JavaEE的企业人事管理信息系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本企业人事管理信息系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

Flutter本地化(国际化)之App名称

文章目录 Android国际化IOS国际化 Flutter开发的App&#xff0c;如果名称想要跟随着系统的语言自动改变&#xff0c;则必须同时配置Android和IOS原生。 Android国际化 打开android\app\src\main\res\values 创建strings.xml 在values上右键&#xff0c;选择New>Values Res…

众和策略:美股全线上涨 中概股大涨

当地时间12月21日&#xff0c;欧洲股市全线下跌&#xff0c;英国富时100指数、法国CAC40指数、德国DAX指数均小幅下跌。美国通胀降温&#xff0c;美股商场三大指数尾盘飙升&#xff0c;纳斯达克指数、标普500指数均涨逾1%&#xff0c;大型科技股多数上涨&#xff0c;特斯拉涨近…