ansbile Tags && Block
Tags
官网示例:https://docs.ansible.com/ansible/2.6/user_guide/playbooks_tags.html
编写执行playbook的时候,每次修改完yml文件,没必要把整个playbook都运行一遍,只需要运行改变了的task。我们可以给task一个标签,运行playbook时明确只运行这个标签(tag)对应的task就可以了。多个任务可以使用同一个tags,一个任务也可以用多个tags表示
官方示例:
- hosts:webserver
tags: deploy #给整个playbook打标签
tasks: - yum: name={{ item }} state=installed with_items: - httpd - memcached tags: #用packages和pk 标签来表示yum这个操作 - packages
- pk - template: src=templates/src.j2 dest=/etc/foo.conf tags: - configuration
此时若希望只run其中的某个task,这run 的时候指定tags即可
ansible-playbook example.yml --tags "configuration,packages" #run 多个tags ansible-playbook example.yml --tags packages # 只run 一个tag
相反,也可以跳过某个task
ansible-playbook example.yml --skip-tags configuration
tags属性放到roles上
roles: - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] } #将会给roles下的所有任务打上标签
tags属性与include结合使用
- include: foo.yml tags=web,foo
always、tagged、untagged、all 是四个系统内置的tag,有自己的特殊意义
always: 指定这个tag 后,task任务将永远被执行,而不用去考虑是否使用了--skip-tags标记
tagged: 当 --tags 指定为它时,则只要有tags标记的task都将被执行,--skip-tags效果相反
untagged: 当 --tags 指定为它时,则所有没有tag标记的task 将被执行,--skip-tags效果相反
all: 这个标记无需指定,ansible-playbook 默认执行的时候就是这个标记.所有task都被执行
Block
block功能可以将任务进行分组,并且可以在块级别上应用任务变量
示例(任务分组):
--- - hosts: web tasks: - block - yum: name=httpd state=present - template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf - service: name=httpd state=started enabled=yes when: ansible_os_family == "RedHat" sudo :yes - block: - apt: name=apache2 state=present - template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf - service: name=httpd state=started enabled=yes when: ansible_os_family == "RedHat" sudo :yes