Ansible检查是否设置了变量

时间:2017-11-18 16:18:24

标签: ansible

我想为我们的客户自动化我们软件的安装过程。因此,我写了一个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"}

显然我做错了,但我不能指出错误。你能帮帮我吗?

编辑:接受的答案帮助了我。谢谢。 但我还有两个问题:

  1. 执行的任务说:

    TASK [fail]
    skipping: [some_ip] => (item=/root)
    skipping: [some_ip] => (item=TMPDIR: /home/foo/bar/tmp)
    
  2. 它被跳过,因为所有变量都已设置,对吗?

    1. 我想如果没有设置变量,我想出了如何打印正确的消息:

      - 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
      
    2. 正确?或者有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 您希望迭代required_vars变量值的值,因此您需要将其作为with_items: "{{ required_vars }}"的参数提供:

    with_items: "{{ required_vars }}"
    

    目前,您提供的是包含静态定义字符串required_vars的单个元素的列表。

  2. 您需要将required_vars列表中元素的数据类型更改为字符串:

    required_vars:
      - "APPHOME: /home/foo/bar"
      - "TMPDIR: /home/foo/bar/tmp"
    

    目前(由于:后跟空格)您定义了词典,因此例如在第一次迭代中item将具有值{ "APPHOME": "/home/foo/bar" },然后总是会失败when条件。

  3. 奖金问题:

    • 您在"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 }}"