使用标签从剧本中执行一项任务

使用标签从剧本中执行一项任务

我有一个剧本,其中包含多个用于打开/关闭机器的任务。我尝试使用标签仅运行一个任务“启动虚拟机”,使用命令ansible run.yaml --tags on但它抛出了错误!标签必须指定为列表。请告诉我我在哪里犯了错误。谢谢

---
- hosts: list
  gather_facts: no
  tasks:
  - name: start
    command: >
            virsh start {{ inventory_hostname }}
    tags: on
    delegate_to: inv
- hosts: off
  gather_facts: no
  tasks:
  - name: stop vm
    command: >
            virsh shutdown --domain {{ inventory_hostname }}
    delegate_to: inv
    tags: off

答案1

问题是在 Ansible 中on被评估为布尔值Trueoff被评估为布尔值False。 看测试真实性。 例如

    - debug:
        msg: "{{ my_tag }} is truthy {{ my_tag is truthy }}"
      vars:
        my_tag: on

给出

  msg: True is truthy True

在标签中使用布尔值时,例如

    - debug:
        msg: tag on
      tags: on

Ansible 抱怨

错误!标签必须指定为列表

这个错误很容易让人误解。事实上,Ansible 抱怨的是数据类型。解决方法很简单。不要使用布尔值作为标记,例如下面的任务按预期工作

    - debug:
        msg: tag my_on
      tags: my_on

给出

shell> ansible-playbook playbook.yml --tags my_on
...
  msg: tag my_on

您可以在标签中使用列表。但是,如果您将字符串放入标签中,它将被解释为列表中的单个项目。请参阅标签

答案2

正如错误消息所述,请尝试以下操作:

---
- hosts: von
  gather_facts: no
  tasks:
  - name: start vm
    command: >
            virsh start {{ inventory_hostname }}
    tags: 
    - on
    delegate_to: sou
- hosts: voff
  gather_facts: no
  tasks:
  - name: stop vm
    command: >
            virsh shutdown --domain {{ inventory_hostname }}
    delegate_to: sou
    tags: 
    - off

在没有尝试您的代码的情况下,我怀疑您可能需要将 virsh 命令放在引号 ( ") 之间才能使 j2 变量替换起作用。

相关内容