我如何才能 运行 只执行具有多个标签的任务?

How can I run only ansible tasks with multiple tags?

想象一下这个 ansible 剧本:

- name: debug foo
  debug: msg=foo
  tags:
     - foo

- name: debug bar
  debug: msg=bar
  tags:
     - bar

- name: debug baz
  debug: msg=baz
  tags:
     - foo
     - bar

如何才能 运行 只有 debug baz 任务?我只想说 运行 个标记有 foobar 的任务。这可能吗?

我试过了,但它会 运行 所有 3 个任务:

ansible-playbook foo.yml -t foo,bar

Ansible 标签使用 "or" 而不是 "and" 作为比较。您创建另一个标签的解决方案是合适的。

我认为正确的语法是:

- name: debug baz
  debug: msg=baz
  tags: foo, bar

尝试 when 指令:

- name: debug foo
  debug: msg=foo
  tags:
     - foo

- name: debug bar
  debug: msg=bar
  tags:
     - bar

- name: debug baz
  debug: msg=baz
  when:
    - '"foo" in ansible_run_tags'
    - '"bar" in ansible_run_tags'

如果你这样使用:

- name: debug baz
  debug: msg=baz
  tags:
    - foo
    - bar

您进行了手术或手术。所以,如果你使用命令:

ansible-playbook -i inventory test.yml --tags foo

ansible-playbook -i inventory test.yml --tags bar

将执行此任务。

如果您使用:

- name: debug baz
  debug: msg=baz
  tags:
    - foo, bar

您进行了一次操作 AND。所以只有命令:

ansible-playbook -i inventory test.yml --tags foo, bar

将执行此任务。

如果 foobar 都给出(即 ansible-playbook foo.yml -t foo,bar:

,请使用以下内容 运行 任务
- debug:
    msg: "(foo and bar)"
  tags:
    - "{{ 'always' if 'foo' in ansible_run_tags and 'bar' in ansible_run_tags else ''}}"

如果在 foobar 或同时提供 foobar 时需要 运行(即 ansible-playbook foo.yml -t foo , ansible-playbook foo.yml -t baransible-playbook foo.yml -t foo,bar) 然后使用以下内容:

- debug:
    msg: "(foo and bar) or foo or bar"
  tags:
    - "{{ 'always' if 'foo' in ansible_run_tags and 'bar' in ansible_run_tags else ''}}"
    - foo
    - bar