当前位置: 首页 > news >正文

05-实施任务控制

05-实施任务控制

实验环境

[azurewhisky@controller ~]$ mkdir web && cd web[azurewhisky@controller web]$ cat > ansible.cfg <<'EOF'
[defaults]
remote_user = azurewhisky
inventory = ./inventory[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOF[azurewhisky@controller web]$ cat > inventory <<'EOF'
controller
node1
node2
node3
node4
EOF

编写循环任务

利用循环,管理员无需编写多个使用同一模块的任务。例如,确保存在五个用户,不需要编写五个任务,而是只需编写一个任务来对含有五个用户的列表迭代。

Ansible支持使用 loop 关键字对一组项目迭代任务。您可以配置循环以利用列表中的各个项目、列表中各个文件的内容、生成的数字序列或更为复杂的结构来重复任务。

本节介绍迭代项目列表的简单循环。

有关更高级的循环方案, 请参阅:https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html

简单循环

简单循环对一组项目迭代任务。loop关键字添加到任务中, 将应对其迭代任务的项目列表取为值。循环变量item保存每个迭代过程中使用的值。

示例:

---
- name: add several usershosts: node1gather_facts: notasks:- name: add user janeuser:name: "jane"groups: "wheel"state: present- name: add user joeuser:name: "joe"state: presentgroups: "wheel"

使用loop循环改写:

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item }}"groups: "wheel"state: presentloop:- jane- joe

或者

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item }}"groups: "wheel"state: presentloop: "{{ users }}"vars:users:- jane- joe
循环散列或字典列表

在以下示例中,列表中的每个项实际上是散列或字典。

示例中的每个散列或字典具有两个键,即name和groups,当前item循环变量中每个键的值可以分别通过item.name和item.groups变量来检索。

示例:

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item.name }}"groups: "{{ item.groups }}"state: presentloop: - name: janegroups: wheel- name: joegroups: root

改写为:

---
- name: add several usershosts: node1gather_facts: novars:users:- name: janegroups: wheel- name: joegroups: roottasks:- name: add users user:name: "{{ item.name }}"state: presentgroups: "{{ item.groups }}"  loop: "{{ users }}"
较早样式的循环关键字

在 Ansible2.5 之前,大多数playbook使用不同的循环语法,前缀为with_ ,后跟Ansible查找插件。这种循环语法在现有playbook中很常见,尤其是with_items广泛用于现有playbook,但在将来可能会被弃用。

with_items

示例:

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item }}"state: presentgroups: "wheel"with_items:- jane- joe

改写为:

- name: add several usershosts: node1gather_facts: notasks:- name: add several usersuser:name: "{{ item }}"state: presentgroups: "wheel"with_items:  - [ jane, joe ]

不建议使用以上这种格式。

替换为loop将不会对列表中内容展开,错误的示例如下:

- name: add several usershosts: node1gather_facts: notasks:- name: add several usersuser:name: "{{ item }}"state: presentgroups: "wheel"loop:  - [ jane, joe ]

with_items 也支持散列或字典列表。

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item.name }}"groups: "{{ item.groups }}"state: presentwith_items: - name: janegroups: wheel- name: joegroups: root

改写为:

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item.name }}"state: presentgroups: "{{ item.groups }}"with_items: - { name: jane ,groups: wheel }- { name: joe, groups: root }

不建议使用以上这种格式。

with_list

with_list关键字 不会对列表展开,类似 loop。

示例:

---
- name: test loophosts: node1gather_facts: notasks:- name: debug with_listdebug:msg: "{{ item }}"with_list:- [ 1,2,3 ]- [ a,b ]

输出结果:1,2,3 a,b。

with_together

示例:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_togetherdebug:msg: "{{ item }}"with_together:- [ 1,2,3 ]- [ a,b,c ]

输出结果是:1,a 2,b 3,c

with_indexed_items

输出项目的时候,同时输出项目对应索引号。

示例1:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_indexed_itemsdebug:msg: "{{ item }}"with_indexed_items:- [ a,b,c ]

输出结果:0,a 1,b 2,c。

示例2:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_indexed_itemsdebug:msg: "{{ item }}"with_indexed_items:- [ a,b,c ]- [ d,e,f ]

输出结果:0,a 1,b 2,c 3,d 4,e 5,f。

with_sequence

示例:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_sequencedebug:msg: "{{ item }}"with_sequence: start=1 end=5 stride=1

输出结果:1 2 3 4 5。

以上效果等同 with_sequence: start=1 end=5 stride=1

也等同: with_sequence: count=5

其他写法参考:

  • with_sequence: start=2 end=10 stride=3
  • with_sequence: start=6 end=2 stride=2
  • with_sequence: start=2 end=6 stride=2 format=“number is %0.2f” 保留两位浮点小数。
with_random_choice

从列表中随机返回一个。

示例:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_random_choicedebug:msg: "{{ item }}"with_random_choice: - 1- 2- 3- 4- 5
with_file

打印文件列表中文件内容。

示例:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_filedebug:msg: "{{ item }}"with_file: - /etc/fstab- /etc/hosts
with_fileglob

打印目录中匹配到的文件名(不包含目录下子目录中文件)。

示例:

---
- name: test loophosts: node1gather_facts: notasks:- name: test with_fileglobdebug:msg: "{{ item }}"with_fileglob: - /etc/host*
旧语法转换

使用旧语法的任何任务(with_开头关键字)都可以使用loop和Ansible过滤器转换。有关如何将旧循环转换为新语法,参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#migrating-from-with-x-to-loop。

Do-Until Loops

示例:测试 node2,什么时候可以ping通。

- name: test loophosts: node1gather_facts: notasks:- shell: ping -c1 -w 2 node2register: resultuntil: result.rc == 0retries: 20delay: 1

delay 代表两次检测任务是否完成的间隔时间,默认值5秒。

Register 与 Loop

示例:

---
- name: Loop Register Testhosts: node1gather_facts: notasks:- name: Looping Echo Taskshell: "echo This is my item: {{ item }}"loop:- one- tworegister: result- name: Show result variabledebug:var: result- name: Show result variable stdoutdebug:msg: "STDOUT from previous task: {{ item.stdout }}"loop: "{{ result.results }}"

编写条件任务

Ansible可使用conditionals在符合特定条件时执行任务或play。

例如,管理员可利用条件来区分不同的受管节点,并根据它们所符合的条件来分配功能角色。 Playbook变量、注册的变量和ANSIBLE FACTS都可通过条件来进行测试。可以使用比较字符串、数字数据和布尔值的运算符。

用例:

  1. 定义变量min_memory,判断被管理节点可用内存是否满足该值。
  2. 捕获命令输出,判定task是否执行完成,以便决定是否进行下一步操作。
  3. 被管理节点上收集到的网络facts,判定是否适合哪种绑定(bonding或者trunking)。
  4. 根据CPU的数量决定如何调优web服务器。
  5. Registered变量与预定义的变量对比,判断是否有变化。例如文件的MD5值。
when 语句

ansible playbook 中使用 when 来运行条件任务。

when 用于有条件地运行任务,取要测试的条件作为值。如果条件满足,则运行任务。若条件不满足,则跳过任务。

注意:通常的惯例是将可能存在的任何when关键字放在任务名称和模块(及模块参数)的后面。原因是任务是YAML散列/字典,when 语句只是任务中的一个键,就如任务的名称以及它所使用的模块一样。

常见判断
操作示例
等于(值为字符串)ansible_machine == “x86_64”
等于(值为数字)max_memory == 512
小于min_memory < 128
大于min_memory > 256
小于等于min_memory <= 256
大于等于min_memory >= 512
不等于min_memory != 512
变量存在min_memory is defined
变量不存在min_memory is not defined
布尔变量值是1、True或yes的求值为memory_available
布尔变量值是0、False或no的求值为memory_available
memory_available变量值为真,最终结果为not memory_available
第一个变量的值存在,作为第二个变量的列表中的值ansible_distribution in supported_distros
布尔值变量判断

示例:

---
- name: test hosts: node1gather_facts: novars:run_my_task: truetasks:- name: test whendebug:msg: "Hello run my task"when: run_my_task

示例中的when语句导致:任务仅在run_my_task为 true时运行。

变量是否定义判断

变量判断:

  • defined == not undefined 变量定义返回真
  • undefined == not defined 变量未定义返回真
  • none 变量定义了,但是值是空值,返回真

示例1:

---
- hosts: node1gather_facts: novars:username: azurewhiskytasks:- debug:msg: "var: username is defined"when: username is defined

示例2:判断受管主机是否具有相应设备。

---
- name: create and use lvhosts: node1tasks:- name: Create a logical volume of 4000mlvol:vg: researchlv: datasize: 4000when: ansible_lvm.vgs.research is defined- debug:msg: Volume group does not existwhen: ansible_lvm.vgs.research is not defined
文件属性判断
  • file:如果路径是一个普通文件,返回真
  • directory:如果路径是一个目录,返回真
  • link:如果路径是一个软连接,返回真
  • mount:如果路径是一个挂载点,返回真
  • exist:如果路径是存在,返回真

示例:

---
- hosts: node1gather_facts: novars:file_name: /etc/hoststasks:- debug:msg: "{{ file_name }} is regular file"when: file_name is file
任务执行结果判断
  • succeeded,通过任务的返回信息判断,任务执行成功返回真。
  • failed,通过任务的返回信息判断,任务执行失败返回真。
  • changed,通过任务的返回信息判断,任务执行状态为changed返回真。
  • skipped,通过任务的返回信息判断,任务没有满足条件跳过执行,返回真。

示例:

---
- hosts: node1gather_facts: novars:doshell: "yes"tasks:- shell: cat /etc/hostsregister: resultignore_errors: truewhen: doshell == "yes"- name: successdebug:msg: successwhen: result is succeeded- name: faileddebug:msg: failedwhen: result is failed- name: changeddebug:msg: changedwhen: result is changed- name: skippeddebug:msg: skipwhen: result is skipped

其他测试:

  • 设置doshell: “no”
  • 设置shell: cat /etc/hosts-no-exist
in 和 not in 判断

示例1:给用户添加组

---
- name: test hosts: node1gather_facts: novars:username: devopssupergroup: wheeltasks:- name: gather user informationshell: id {{ username }}register: result- name: Task run if user is in supergroupsuser:name: "{{ username }}"groups: "{{ supergroup }}"append: yeswhen:  supergroup not in result.stdout

示例2:给用户添加多个组

---
- name: test hosts: node1gather_facts: novars:username: devopssupergroups: - wheel- roottasks:- name: gather user informationshell: id {{ username }}register: result- name: Task run username is in supergroupsuser:name: "{{ username }}"groups: "{{ item }}"append: yeswhen:  item not in result.stdoutloop: "{{ supergroups }}"
其他判断
字符串大小写判断
  • string:是字符串返回真
  • lower:如果字符串全部是小写字母,返回真
  • upper:如果字符串全部是大写字母,返回真
奇偶数判断
  • number:是数字返回真
  • even:偶数返回真
  • odd:奇数返回真
父子集合判断
  • subset:一个list是另一个list子集,返回真(a is subset(b))
  • superset:一个list是另一个list父集,返回真(a is superset(b))
多个条件判断

playbook中when语句结合 and 或 or 条件组合,用括号分组条件,实现多条件判断。

and

使用and运算时,两个条件都必须为真,才能满足整个条件语句。

示例:

when: ansible_kernel == "3.10.0-327.e17.x86_64" and inventory_hostname in groups['staging'] 

when关键字还支持使用列表来描述条件列表。向when关键字提供列表时, 将使用and运算组合所有条件。

示例:

when:- ansible_kernel == "3.10.0-327.e17.x86_64"- inventory_hostname in groups['staging']

优先使用列表格式,第二种格式可读性高。

or

如果任一条件为真时满足条件语句, 则应当使用or语句。

示例:

when: ansible_distribution == "RedHat" or ansible_distribution == "Fedora" 
组合判断

通过使用括号()分组条件,可以表达更复杂的条件语句。

示例:

when: (ansible_distribution == "RedHat" and ansible_distribution_major_version == 7) or (ansible_distribution == "Fedora" and ansible_distribution_major_version == 23) 
loop 和 when 联合

示例:当 / 文件系统可用空间大于300000000 安装 mariadb-server

解决方法:通过 ansible_facts 获取 / 文件系统可用空间

---
- name: Combining Loops and Conditional Playhosts: node1tasks:- name: install mariadb-server if enough space on rootyum:name: mariadb-serverstate: latestloop: "{{ ansible_mounts }}"when: - item.mount == "/"- item.size_available > 300000000 
register 和 when 联合

示例:当 / 文件系统可用空间大于300000000 安装 mariadb-server

解决方法:通过 shell 获取 / 文件系统可用空间

---
- name: test hosts: node1gather_facts: notasks:- name: get / availableshell: df / | awk 'NR==2 {print $4}'register: fs_size- name: install mariadb-serverdnf:name: mariadb-serverstate: presentwhen: fs_size.stdout | int >= 300000

Ansible Handlers

Ansible Handlers 功能

Ansible的模块的设计是可以多次执行的,当被管理节点是预期状态时,是不会做任何更改的。然而,有时候执行了一个任务,还需要进一步执行下一个任务。

例如,更改了服务配置文件之后,需要重新加载配置文件才能生效。Handlers是由其他任务通知执行的任务,可看做inactive任务,通过notify调用。

示例:

---
- name: deploy web serverhosts: node1tasks:- name: install packagesyum:name: httpdstate: presentnotify:- enable and restart apache- name: install httpd-manualyum:name: httpd-manualstate: presentnotify:- enable and restart apache- debug: msg: last task in taskshandlers:- name: enable and restart apacheservice:name: httpdstate: restartedenabled: yes

多次执行剧本验证:

  • 第一次执行:

    确保目标主机未安装httpd和httpd-manual。

    在这里插入图片描述

  • 第二次执行:

    在这里插入图片描述

Ansible Handlers 使用总结

  • play中所有任务执行完成后,才会运行那些被notify调用的handler。
  • 即使有多个任务通知handler,该handler依然仅运行一次。
  • 如果包含notify语句的任务没有报告changed结果(例如,软件包已安装并且任务报告ok) ,则handler不会获得通知,则handler就不会运行。

通常而言,handler一般用于重新引导主机和重新启动(或重载)系统服务。

meta 模块

在多个任务中间加入meta任务,那么在此之前调用的 handler 会立即处理。

示例:

---
- name: deploy db serverhosts: node1tasks:- name: install mariadbyum:name:- mariadb-server- python3-PyMySQLstate: presentnotify:- enable_and_start_db- meta: flush_handlers- name: add mariadb usermysql_user:name: azurewhiskypassword: redhathandlers:- name: enable_and_start_dbservice:name: mariadbstate: started
调用多个handler
notify 列表调用

notify 使用列表调用,一次调用多个handler。

示例:

---
- name: deploy  serverhosts: node1tasks:- name: install packagesyum:name:- httpd- httpd-manualstate: present- name: deploy overshell: echo deploy overnotify:- enable apache- start apachehandlers:- name: start apacheservice:name: httpdstate: started- name: enable apacheservice:name: httpdenabled: yes
handler 分组调用

利用handler分组,一次调用多个handler,关键字listen。

示例:

---
- name: deploy  serverhosts: node1tasks:- name: install packagesyum:name:- httpd- httpd-manualstate: present- name: deploy overshell: echo deploy overnotify:- enable and start apachehandlers:- name: start apacheservice:name: httpdstate: startedlisten: enable and start apache- name: enable apacheservice:name: httpdenabled: yeslisten: enable and start apache

说明:

  • handler中任务名称必须唯一,如果两个handler具有相同的名称, 则仅会运行一个。
  • handler始终按照handlers部分指定的顺序运行,并不是按照任务notify顺序运行。

处理 Errors

Errors 介绍

Ansible评估各任务的返回代码,从而确定任务是成功还是失败。通常而言, 当某个主机执行任务失败时,Ansible将立即终止该主机继续执行play,其他主机可以继续执行play。

示例:

---
- name: testhosts: node1,node2tasks:- name: show /etc/myhostsshell: cat /etc/myhosts- name: echo enddebug:msg: echo end

环境准备:

[root@node1 ~]# cp /etc/hosts /etc/myhost
[root@node2 ~]# rm -f /etc/myhost
ignore_errors

您可能希望即使在任务失败时也继续执行play。例如,您或许预期特定任务有可能会失败,并且希望通过有条件地运行某项其他任务来恢复。

ignore_errors可以定义在以下位置:

  • 定义在 play 中,则play中所有任务忽略错误。
  • 定义在 task 中,则特定task忽略错误。

示例:

---
- name: testhosts: node1tasks:- name: install a not exist packageyum:name: notexitpackagestate: presentignore_errors: yesregister: result- name: debug install resultdebug:msg: notexitpackage is not exitwhen: result is failed
force_handlers

play中使用关键字 force_handlers,控制当play中某个任务执行失败后是否继续执行之前定义的notify,可用值yes或no(也可以是true或false),默认no(false)。

示例:

---
- name: testhosts: node1force_handlers: yestasks:- name: a task which always notifies its handlercommand: /bin/truenotify: restart the sshd- name:  fails because the package doesn't existyum:name: notexistpkgstate: latesthandlers:- name: restart the sshdservice:name: sshdstate: restarted
fail 模块

fail 模块,执行该任务,任务必定 failed。

示例:

- name: test fail modulehosts: node1gather_facts: notasks:- debug:msg: task1- fail:- debug:msg: task3

提示:fail模块本身也可以配置when判断,实现说明情况下任务是失败的。

failed_when

指明什么条件下,判定任务执行失败。

示例:

- name: test failed_whenhosts: node1tasks:- shell: /root/adduserregister: command_resultfailed_when: "'failed' in command_result.stdout"

环境准备:

[root@node1 ~]# cat /root/adduser 
#!/bin/bash
useradd devops &> /dev/null
if [ $? -eq 0 ];thenecho add user devops success
elseecho add user devops failed
fi
[root@node1 ~]# chmod +x /root/adduser 

以上示例:

  • 当devops用户不存在时,shell模块跳过执行。
  • 当devops用户存在时,shell模块执行失败。

以上示例可改写为fail模块和when语句联合使用:

- name: test fail modulehosts: node1tasks:- shell: /root/adduserregister: command_result- fail:msg: "add user devops failed"when: "'failed' in command_result.stdout"
changed_when

指明什么条件下,判定任务执行结果为changed。

示例1:

- name: changed_whenhosts: node1tasks:- name: upgrade-databaseshell: /usr/local/bin/upgrade-databaseregister: resultchanged_when: "'Success' in result.stdout"notify:- restart_databasehandlers:- name: restart_databaseservice:name: mariadbstate: restarted

环境准备:

[root@node1 ~]# yum install -y mariadb-server
[root@node1 ~]# systemctl enable mariadb --now
[root@node1 ~]# vim /usr/local/bin/upgrade-database
#!/bin/bash
mysql -e 'create user azurewhisky@"%" identified by "redhat";' && mysql -e 'GRANT ALL PRIVILEGES on *.* TO azurewhisky@"%";' && echo update database Success
[root@node1 ~]# chmod +x /usr/local/bin/upgrade-database

对于command模块和shell模块,只要命令正常执行,结果状态通常都是changed。可以通过返回码和输出结果来判定它们是否做出更改。

关键字 changed_when: false ,让任务结果状态不为changed,只能报告为ok或failed。

示例2:

---
- name: Test Whenhosts: node1gather_facts: notasks:- name: test changed_whenshell: cat /etc/redhat-releasechanged_when: false
Ansible block

多个任务作为block子条目,block作为多个任务整体。

示例:

- name: block examplehosts: node1tasks:- block:- debug:msg: task1- debug:msg: task2when: ansible_distribution == "RedHat"

这里的when判断结果影响block中所有任务,关键字when与block对齐。

对齐语法二:

- name: block examplehosts: node1tasks:- block:- debug:msg: task1- debug:msg: task2when: ansible_distribution == "RedHat"

blocks 还可以与 rescue和always一起使用:

  • block:定义主要任务。
  • rescue:block中任务执行失败后,就会执行rescue中定义的任务。
  • always:无论block和rescue中任务执行是否成功和失败,都会执行的任务。

block配置when指令,同样适用rescue和always。

**示例1:**更新数据库,更新失败要回滚,最后要重启数据库。

- name: upgrade dbblock:- name: upgrade the databaseshell:cmd: /usr/local/lib/upgrade-databaserescue:# 数据库更新失败就回滚- name: revert the database upgradeshell:cmd: /usr/local/lib/revert-databasealways:# 重启数据库- name: always restart the databaseservice:name: mariadbstate: restartedwhen: ansible_distribution == "RedHat"   # 此处的when语句将作用于block、rescue和always子句

**示例2:**在所有受管节点上创建符合以下要求的逻辑卷:

  • 在research卷组中创建逻辑卷:

    • 逻辑卷名称为data

    • 逻辑卷大小为4000MiB

    • 使用ext4文件系统格式化逻辑卷

    • 将逻辑卷挂载到/data目录

    • 如果无法创建请求的逻辑卷大小,应显示错误信息:Could not create logical volume of that size 并且应改为使用大小800MiB。

  • 如果卷组research不存在,应显示错误信息:Volume does not exist

环境准备

# node1:添加一块 20G sata 硬盘
[root@node1 ~]# vgcreate research /dev/sdb# node2:添加一块 20G sata 硬盘
[root@node2 ~]# parted /dev/sdb unit MiB mklabel msdos
[root@node2 ~]# parted /dev/sdb unit MiB mkpart primary 1 1025
[root@node2 ~]# vgcreate research /dev/sdb1

playbook.yaml内容如下:

---
- name: create and use lvhosts: alltasks:- block:- name: Create a logical volume of 4000mlvol:vg: researchlv: datasize: 4000rescue:- debug:msg: Could not create logical volume of that size- name: Create a logical volume of 800mlvol:vg: researchlv: datasize: 800always:- name: Create a ext4filesystem:fstype: ext4dev: /dev/research/data- name: create directory /datafile:path: /datastate: directory- name: Mount /dev/research/datamount:path: /datasrc: /dev/research/datafstype: ext4state: mountedwhen: ansible_lvm.vgs.research is defined- name: Volume group does not existdebug:msg: Volume group does not existwhen: ansible_lvm.vgs.research is not defined

实施 Tags

有时候只需要执行playbook中部分任务,可以通过Tags给任务打标签实现,运行剧本的时候只执行具有特定tag标签的任务。

关键字tags,后跟tags列表。

示例:

---
- name: test tagshosts: node1gather_facts: notasks:- name: httpd is installedyum:name: httpdstate: latesttags: webserver- name: postfix is installedyum:name: postfixstate: latesttags: mailserver- name: always debugdebug:msg: debug

执行测试:

[azurewhisky@controller web]$ ansible-playbook playbook.yaml --list-tags
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags webserver
[azurewhisky@controller web]$ ansible-playbook tags.yml --skip-tags webserver

特殊tags:

  • all,默认行为,除了never之外的所有任务。
  • tagged,用于执行所有有标记的资源。
  • untagged,与tagged相反,标识所有未标记的资源。
  • always,该标记的任务总是会执行,除非明确指定跳过always标签:–skip-tags always
  • never,该标记的任务总是不执行,除非明确指定该标签:–tags never

示例:

---
- name: test tagshosts: node1gather_facts: notasks:- name: httpd is installedyum:name: httpdstate: latesttags: webserver- name: postfix is installedyum:name: postfixstate: latesttags: mailserver- name: always debugdebug:msg: debug
#      tags:
#        - always
#        - never

执行测试:

# 第三个任务不使用标签
[azurewhisky@controller web]$ ansible-playbook playbook.yaml --list-tags
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags webserver
[azurewhisky@controller web]$ ansible-playbook tags.yml --skip-tags webserver# 第三个任务使用always标签
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags webserver
[azurewhisky@controller web]$ ansible-playbook tags.yml --skip-tags always# 第三个任务使用never标签
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags never

g: debug


执行测试:```bash
[azurewhisky@controller web]$ ansible-playbook playbook.yaml --list-tags
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags webserver
[azurewhisky@controller web]$ ansible-playbook tags.yml --skip-tags webserver

特殊tags:

  • all,默认行为,除了never之外的所有任务。
  • tagged,用于执行所有有标记的资源。
  • untagged,与tagged相反,标识所有未标记的资源。
  • always,该标记的任务总是会执行,除非明确指定跳过always标签:–skip-tags always
  • never,该标记的任务总是不执行,除非明确指定该标签:–tags never

示例:

---
- name: test tagshosts: node1gather_facts: notasks:- name: httpd is installedyum:name: httpdstate: latesttags: webserver- name: postfix is installedyum:name: postfixstate: latesttags: mailserver- name: always debugdebug:msg: debug
#      tags:
#        - always
#        - never

执行测试:

# 第三个任务不使用标签
[azurewhisky@controller web]$ ansible-playbook playbook.yaml --list-tags
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags webserver
[azurewhisky@controller web]$ ansible-playbook tags.yml --skip-tags webserver# 第三个任务使用always标签
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags webserver
[azurewhisky@controller web]$ ansible-playbook tags.yml --skip-tags always# 第三个任务使用never标签
[azurewhisky@controller web]$ ansible-playbook tags.yml --tags never
http://www.dtcms.com/a/336039.html

相关文章:

  • open Stack及VM虚拟机和其他平台虚拟机迁移至 VMware vSphere(esxi)虚拟化平台骨灰级后台磁盘替换法迁移方式
  • Maven依赖范围
  • C11期作业18(07.12)
  • 跨越南北的养老对话:为培养“银发中国”人才注入新动能
  • Linux——一些常用的其他命令
  • 学习Python中Selenium模块的基本用法(5:程序基本步骤)
  • MySQL数据库备份与恢复
  • 《棒球百科》奥运会取消了棒球·野球1号位
  • 旋钮键盘项目---foc讲解(闭环位置控制)
  • Redis-plus-plus API使用指南:通用操作与数据类型接口介绍
  • TensorFlow|张量流
  • C/C++复习(四)
  • 【LeetCode】单链表经典算法:移除元素,反转链表,约瑟夫环问题,找中间节点,分割链表
  • Javascript面试题及详细答案150道之(106-120)
  • 深度学习——常见的神经网络
  • Tomcat 类加载器原理深度解析
  • PowerPoint和WPS演示让多个对象通过动画同时出现
  • 近期(2021-2025)发行的常用国军标GJB 整理,2021,2022,2023,2024,2025
  • 深入理解QFlags:Qt中的位标志管理工具
  • 本文将详细介绍如何构建一个功能完整的键盘测试工具,包含虚拟键盘、实时统计、打字练习等核心功能,无需任何后端服务或复杂依赖。
  • 无人机视角土地区域类型识别分割数据集labelme格式4904张7类别
  • 使用oradebug收集数据库诊断信息
  • 第3章 Java NIO核心详解
  • AOP配置类自动注入
  • Linux系统分析 CPU 性能问题的工具汇总
  • 【102页PPT】某著名企业智能制造解决方案及智能工厂产品介绍(附下载方式)
  • 19.5 「4步压缩大模型:GPTQ量化实战让OPT-1.3B显存直降75%」
  • 微网智能光储协调控制器方案
  • 【运维进阶】实施任务控制
  • 网络原理与编程实战:从 TCP/IP 到 HTTP/HTTPS