我有一个剧本,其中包含多个用于打开/关闭机器的任务。我尝试使用标签仅运行一个任务“启动虚拟机”,使用命令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
被评估为布尔值True
和off
被评估为布尔值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 变量替换起作用。