我有一本包含和标记各种角色的剧本:
- name: base
hosts: "{{ host | default('localhost') }}"
roles:
- { role: apt, tags: [ 'base', 'apt', 'ubuntu']}
- { role: homebrew, tags: [ 'base', 'homebrew', osx' ]}
- { role: base16, tags: [ 'base', 'base16', 'osx' ]}
- { role: nodejs, tags: [ 'base', 'nodejs' ]}
- { role: tmux, tags: [ 'base', 'tmux' ]}
- { role: vim, tags: [ 'base', 'vim' ]}
- { role: virtualenv, tags: [ 'base', virtualenv', 'python' ]}
- { role: homebrew_cask, tags: [ 'desktop', 'homebrew_cask', osx' ]}
- { role: gnome_terminator, tags: [ 'desktop', 'gnome_terminator', ubuntu' ]}
大多数任务都使用when子句来确定它们应在哪个OS上运行,例如:
- name: install base packages
when: ansible_distribution == 'MacOSX'
sudo: no
homebrew:
name: "{{ item.name }}"
state: latest
install_options: "{{ item.install_options|default() }}"
with_items: homebrew_packages
如果我在不指定任何标签的情况下运行
ansible-playbook base.yml
,则所有任务都将运行。如果指定标签,例如ansible-playbook base.yml --tags='base'
,则仅使用base run
标记的角色。默认情况下(如果未指定标签),我只想运行标有
'base'
的角色,而不是标有'desktop'
的角色。最好在当前操作系统的基础上设置默认的'os'标签,以避免在OSX上运行剧本时包含ubuntu的所有任务(反之亦然)。
有什么想法,如果可能的话,我该怎么做?
最佳答案
不幸的是,没有这样的功能。当前,Ansible中的标签处理非常有限。默认情况下,您不能设置默认标签,也不能排除标签。
Google用户组上有一些线程,而github上有一些功能请求。但是还没有结果。到目前为止,常见的答案是,您应该创建一个shell脚本并将其放在您的剧本前面。然后,该脚本可以根据需要设置--tags
和--skip-tags
。非常不愉快,但据我所知,这是目前唯一的选择。
关于tags - Ansible-默认/显式标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789912/