Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tags Ansible-默认/显式标记_Tags_Ansible_Ansible Playbook - Fatal编程技术网

Tags Ansible-默认/显式标记

Tags Ansible-默认/显式标记,tags,ansible,ansible-playbook,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,

我有一本剧本,其中包括并标记了各种角色:

- 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子句来确定它们应该在哪个操作系统上运行,例如:

- 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标记的角色才能运行

默认情况下(如果未指定标记),我只希望运行用
'base'
标记的角色,而不希望运行用
'desktop'
标记的角色

基于当前的操作系统,设置一个默认的“os”标签,以避免在OSX上运行playbook时包含ubuntu的所有任务,这也非常好(反之亦然)


如果这是可能的话,有什么想法吗?我该怎么做?

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

Google用户组上有一些线程,github上也有关于这方面的功能请求。但还没有结果。到目前为止,常见的答案是,您应该创建一个shell脚本,并将其放在您的剧本前面。然后,此脚本可以根据您的需要设置
--tags
--skip tags
。非常不愉快,但据我所知,目前唯一的选择是

如果在不指定任何标记的情况下运行ansible playbook base.yml,则所有任务都会运行

是的,这很危险。 如果忘记添加“--tags=xxxxx”,则可能会运行不需要的任务

有一个解决方法,这很糟糕,但它会阻止在命令行中没有标记时运行任务

您可以使用--extra vars并在您的剧本中使用它,然后运行:

ansible-playbook base.yml -e'SOMEVAR=TRUE'
在你的剧本中:

- hosts: localhost
  tasks:
   - name: some task
     ping:
     tags:
      - sometag

   - name: Register SOMEVARANS
     set_fact: SOMEVARANS={{SOMEVAR | default('False')}}
     tags:
      - every_tag_you_know_since_there_is_no_ALL_option
      - sometag

   - debug: msg="{{SOMEVARANS}}"
     tags:
      - every_tag_you_know_since_there_is_no_ALL_option
      - sometag

   - debug: msg="run only with extravars SOMEVAR=True"
     when: SOMEVARANS
     tags:
      - every_tag_you_know_since_there_is_no_ALL_option
      - sometag
结果是:

$ ansible-playbook -i /subsystem/ansible/etc/inventory-qa.ini  tags.yml

PLAY [localhost] **************************************************************

TASK: [some task] *************************************************************
ok: [localhost]

TASK: [Register SOMEVARANS] ***************************************************
ok: [localhost]

TASK: [debug msg="{{SOMEVARANS}}"] ********************************************
ok: [localhost] => {
    "msg": "False"
}

TASK: [debug msg="run only with extravars SOMEVAR=True"] **********************
skipping: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0



 WITH 'SOMEVAR=True'
    $ ansible-playbook -i /subsystem/ansible/etc/inventory-qa.ini  tags.yml  -e 'SOMEVAR=True'

    PLAY [localhost] **************************************************************

    TASK: [some task] *************************************************************
    ok: [localhost]

    TASK: [Register SOMEVARANS] ***************************************************
    ok: [localhost]

    TASK: [debug msg="{{SOMEVARANS}}"] ********************************************
    ok: [localhost] => {
        "msg": "True"
    }

    TASK: [debug msg="run only with extravars SOMEVAR=True"] **********************
    ok: [localhost] => {
        "msg": "run only with extravars SOMEVAR=True"
    }

    PLAY RECAP ********************************************************************
    localhost                  : ok=4    changed=0    unreachable=0    failed=0


ALL IN ONE :)
$ ansible-playbook -i /subsystem/ansible/etc/inventory-qa.ini  tags.yml  -e 'SOMEVAR=True'  --tags=sometag

PLAY [localhost] **************************************************************

TASK: [some task] *************************************************************
ok: [localhost]

TASK: [Register SOMEVARANS] ***************************************************
ok: [localhost]

TASK: [debug msg="{{SOMEVARANS}}"] ********************************************
ok: [localhost] => {
    "msg": "True"
}

TASK: [debug msg="run only with extravars SOMEVAR=True"] **********************
ok: [localhost] => {
    "msg": "run only with extravars SOMEVAR=True"
}

PLAY RECAP ********************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0

我使用命令行变量重写(
-e
)来实现这一点:

$ ansible-playbook playbook.xml -e desktop=true
与其将
desktop
定义为标记,不如将其定义为默认值为
false
的变量。然后,对于要求
desktop
为true的角色,将标记替换为
when
子句。问题中发布的剧本可能会改写如下:

- name:  base
  hosts: "{{ host | default('localhost') }}"

  # default value to prevent errors when not overridden
  vars:
    desktop: false

  roles:

    # no change to "base" roles
    - { role: apt, tags: [ 'base', 'apt', 'ubuntu'] }
    # ...

    # "desktop" roles get a "when" clause
    - role: homebrew_cask
      when: desktop | bool
      tags: [ 'homebrew_cask', 'osx' ]
    - role: gnome_terminator
      when: desktop | bool
      tags: [ 'gnome_terminator', ubuntu' ]
ansible-playbook -t base base.yml
- 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' ]}
这可能只是现有答案之一的简化版本。如其他地方所述,此时标记并不是将某些操作默认为不运行的答案,除非明确指定了某些操作。另一方面,变量非常适合这一点

还有另外3个标签的特殊关键字“taged”、“untaged”和“all”,分别运行taged、only untaged和all任务。 默认情况下,ansible运行时就像指定了“-tags all”


您可以在这里查看文档:

使用默认值的原因通常是:我希望在我最常用的用例中键入尽可能少的内容。所以我认为OP真正想要的是:

是否有方法以尽可能少的参数运行“基本”任务。

正如其他人指出的,ansible中没有“默认”标记。但总有办法

第一种方法是使用脚本来包装它,就像 像这样编写
run.sh

- name:  base
  hosts: "{{ host | default('localhost') }}"

  # default value to prevent errors when not overridden
  vars:
    desktop: false

  roles:

    # no change to "base" roles
    - { role: apt, tags: [ 'base', 'apt', 'ubuntu'] }
    # ...

    # "desktop" roles get a "when" clause
    - role: homebrew_cask
      when: desktop | bool
      tags: [ 'homebrew_cask', 'osx' ]
    - role: gnome_terminator
      when: desktop | bool
      tags: [ 'gnome_terminator', ubuntu' ]
ansible-playbook -t base base.yml
- 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.sh
而不是完整的命令要短得多

第二种方法是为那些正在寻找纯ansible解决方案的人。您可以有两个剧本,如:

base.yml

- { 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' ]}
desktop.yml

- { role: homebrew_cask,    tags: [ 'desktop', 'homebrew_cask', osx' ]}
- { role: gnome_terminator, tags: [ 'desktop', 'gnome_terminator', ubuntu' ]}
对于仅限基本任务,请运行ansible playbook base.yml; 对于仅限于桌面的任务,请运行ansible playbook desktop.yml; 对于所有任务,运行ansible playbook base.yml desktop.yml
它也比定义“默认”标记更容易出错

OP还需要一个默认的OS标记。当

   - { role: some_role, when: "ansible_os_family == 'Debian'" } 

使用
时,您不需要在命令行中执行任何操作,ansible会检测类型并为您运行相应的任务。

由于ansible 2.5有一个新功能可以解决此类情况

另一个特殊标记是never,它将阻止任务运行 除非特别要求标签

所以你的问题应该这样解决:

- name:  base
  hosts: "{{ host | default('localhost') }}"

  # default value to prevent errors when not overridden
  vars:
    desktop: false

  roles:

    # no change to "base" roles
    - { role: apt, tags: [ 'base', 'apt', 'ubuntu'] }
    # ...

    # "desktop" roles get a "when" clause
    - role: homebrew_cask
      when: desktop | bool
      tags: [ 'homebrew_cask', 'osx' ]
    - role: gnome_terminator
      when: desktop | bool
      tags: [ 'gnome_terminator', ubuntu' ]
ansible-playbook -t base base.yml
- 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' ]}