Ansible - 默认/显式标签

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)


udo*_*dan 6

不幸的是没有这样的功能.Ansible中的标签处理目前非常有限.您无法设置默认标记,也不能默认排除标记.

Google用户组中有一些主题,并且github上有关于此的功能请求.但还没有结果.到目前为止,常见的答案是,您应该创建一个shell脚本并将其放在您的剧本前面.该脚本则可以设置--tags--skip-tags相应您的需求.非常不愉快,但据我所知,现在唯一的选择.