nfa*_*rar 9 tags ansible ansible-playbook
我有一个包含并标记各种角色的剧本:
- 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' ]}
Run Code Online (Sandbox Code Playgroud)
大多数任务都使用when子句来确定应该运行哪个操作系统,例如:
- 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
Run Code Online (Sandbox Code Playgroud)
如果我在ansible-playbook base.yml没有指定任何标签的情况下运行,则运行所有任务 例如ansible-playbook base.yml --tags='base',如果我指定标记,则只标记带有的标记base run.
默认情况下(如果没有指定标签),我只想运行标记的角色'base',而不是标记的角色'desktop'.
基于当前操作系统设置默认的'os'标签也是非常好的,以避免在我在OSX上运行playbook时包含ubuntu的所有任务(反之亦然).
任何想法,如果这是可能的,我怎么可能这样做?
小智 7
从 Ansible 2.5 开始,有一个新功能可以解决这些情况。
另一个特殊标签是从不,除非特别请求标签,否则它将阻止任务运行。
Example:
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
Run Code Online (Sandbox Code Playgroud)
所以你的问题应该这样解决:
- 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: [ 'never','desktop', 'homebrew_cask', osx' ]}
- { role: gnome_terminator, tags: [ 'never','desktop', 'gnome_terminator', ubuntu' ]}
Run Code Online (Sandbox Code Playgroud)
不幸的是没有这样的功能.Ansible中的标签处理目前非常有限.您无法设置默认标记,也不能默认排除标记.
Google用户组中有一些主题,并且github上有关于此的功能请求.但还没有结果.到目前为止,常见的答案是,您应该创建一个shell脚本并将其放在您的剧本前面.该脚本则可以设置--tags和--skip-tags相应您的需求.非常不愉快,但据我所知,现在唯一的选择.