我想为我们的客户自动化我们软件的安装过程。因此,我写了一个Ansible playbook,其任务应检查是否设置了所有必需变量:
- name: Check environment variables.
hosts: all
vars_files:
- required_vars.yml
tasks:
- fail: msg="Variable '{{ item }}' is not defined"
when: item not in hostvars[inventory_hostname]
with_items:
- required_vars
required_vars.yml
看起来像这样:
required_vars:
- APPHOME: /home/foo/bar
- TMPDIR: /home/foo/bar/tmp
当我通过ansible-playbook -i inventory/dev.yml playbook.yml
执行剧本时,我收到以下错误:
TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************************ok: [localhost]
TASK [fail] ************************************************************************************************************************************************************************************************************************************failed:
[localhost] (item=required_vars) => {"changed": false, "failed": true, "item": "required_vars", "msg": "Variable 'required_vars' is not defined"}
显然我做错了,但我不能指出错误。你能帮帮我吗?
编辑:接受的答案帮助了我。谢谢。 但我还有两个问题:
执行的任务说:
TASK [fail]
skipping: [some_ip] => (item=/root)
skipping: [some_ip] => (item=TMPDIR: /home/foo/bar/tmp)
它被跳过,因为所有变量都已设置,对吗?
我想如果没有设置变量,我想出了如何打印正确的消息:
- name: Check environment variables.
hosts: all
vars_files:
- required_vars.yml
tasks:
- fail:
msg: "Variable '{{ item }}' is not defined"
with_items: "{{ required_vars }}"
when: item is undefined
正确?或者有更好的解决方案吗?
答案 0 :(得分:1)
这里有两个问题:
您希望迭代required_vars
变量值的值,因此您需要将其作为with_items: "{{ required_vars }}"
的参数提供:
with_items: "{{ required_vars }}"
目前,您提供的是包含静态定义字符串required_vars
的单个元素的列表。
您需要将required_vars
列表中元素的数据类型更改为字符串:
required_vars:
- "APPHOME: /home/foo/bar"
- "TMPDIR: /home/foo/bar/tmp"
目前(由于:
后跟空格)您定义了词典,因此例如在第一次迭代中item
将具有值{ "APPHOME": "/home/foo/bar" }
,然后总是会失败when
条件。
奖金问题:
您在"Variable '{{ item }}' is not defined"
;
Ansible报告Variable 'required_vars' is not defined
;
以上不是错误,正如您所想(“我收到以下错误”),但是fail
模块的正确结果以及您定义的消息自己。
答案 1 :(得分:0)
因为你只有一个值可用于' with_items'我认为它应该是这样的:
with_items: "{{ required_vars }}"
在一行上并带有括号和引号。一旦你有一个以上的项目,就可以像你一样使用这个列表:
with_items:
- "{{ one }}"
- "{{ two }}"