ansible 中可以对 play、role、include、task 打一个 tag(标签)

  • 当命令 ansible-playbook 有-t 参数时,只会执行-t 指定的 tag
  • 当命令 ansible-playbook 有--skip-tags 参数时,则除了--skip-tags 指定的tag 外,执行其他所有

Ansible技术问答:http://linux.xyz/topic/Ansible

1、基本应用

---
- hosts: 192.168.0.105
 tags:
 - one #为一个 play 打 tag
 tasks:
 - name: exec ifconfig
 command: /sbin/ifconfig
 tags:
 - exec_ifconfig #为一个 task 打 tag

2、对 include 语句打 tags

---
- hosts: 192.168.0.105
 gather_facts: no
 tasks:
 - include: foo.yml
 tags: #方式一
 - one
 - include: bar.yml tags=two #方式二

上面两种打 tags 的方式都可以,此时:

ansible-playbook test.yml #执行 foo.yml 和 bar.yml
ansible-playbook test.yml -t one #只执行 foo.yml
ansible-playbook test.yml -t two #只执行 bar.yml

3、同一对象打打多个 tags

---
- hosts: 192.168.0.105
 gather_facts: no
 tasks:
 - include: foo.yml tags=one,two
 - include: bar.yml tags=two

可以对同一对象打多个 tags,只要-t 指定了其中一个 tags,就会执行该对象:

ansible-playbook test.yml #执行 foo.yml 和 bar.yml
ansible-playbook test.yml -t one #只执行 foo.yml
ansible-playbook test.yml -t two #因为两个include 都有two这个标签,所以 foo.yml 和 bar.yml 都会执行

4、对 roles 打 tags

---
- hosts: 192.168.0.105
 gather_facts: no
 roles:
 - {role: foo, tags: one}
 - {role: bar, tags: [one,two]} #同时对 bar 打两个 tag

则:

ansible-playbook test.yml #执行 foo 和 bar 两个 role
ansible-playbook test.yml -t two #只执行 bar
ansible-playbook test.yml -t one #两个 role 都有 one 标签,所以 foo 和 bar 都会执行

5、对多个对象打同一个 tags

---
- hosts: 192.168.0.105
 gather_facts: no
 tasks:
 - name: exec ifconfig
 command: /sbin/ifconfig
 tags:
 - exec_cmd
 - name: exec ls
 command: /bin/ls
 tags:
 - exec_cmd
 - name: debug_test one
 debug: msg="test1"
 tags:
 - debug_test
 - name: debug_test two
 debug: msg="test2"
 tags:
 - debug_test

如上面,可以把执行 command 模块的 task 都打上 exec_cmd 标签,则:

ansible-playbook test1.yml #执行所有 tasks
ansible-playbook test1.yml -t exec_cmd #只执行 tag 为 exec_cmd 的 tasks