如何在Ansible when语句中引用项目

时间:2019-05-09 11:18:10

标签: ansible

Ansible剧本中,是否有可能与以下等效?

- name: "Example"
  command: "./create_user.sh create {{ item.key }} {{ item.value.pwd }}"
  args:
    chdir: "/usr/local/bin/"
  with_dict: "{{ users }}"
  when:
    - verb == 'create'
    - profile in item.value['env']

当前Ansible出现错误,令人窒息:

  

失败! => {“ msg”:“条件检查'item.value ['env']中的配置文件失败。错误是:评估条件时出错(item.value ['env']中的配置文件):无法查找名称或访问模板字符串中的属性({%如果item.value ['env']中的配置文件为%,则为True {%else%},否则为{%endif%})。\ n请确保您的变量名不包含无效字符像'-':类型'StrictUndefined'的参数不可迭代\ n \ n错误似乎出在...

2 个答案:

答案 0 :(得分:0)

您可以使用循环,并使用loop_control委托给包含的任务。例如:

main.yml

- name: "Example"
  include_tasks: create-user.yml
  loop: "{{ users }}"
  loop_control:
    loop_var: user

create-user.yml(这里 item 被别名为变量user(如果需要,您甚至可以循环另一个变量)。

- name: create user
  command: "./create_user.sh create {{ user.key }} {{ user.value.pwd }}"
  args:
    chdir: "/usr/local/bin/"
  when:
    - verb == 'create'
    - profile in user.value['env']

我从来没有将这个结构与字典一起使用,但是它应该可以工作(也许稍作调整)。

答案 1 :(得分:0)

看来您的剧本中有一个简单的语法错误。您所指的是名为profile的变量,但它不存在。如果要检查item.value['env']中是否包含文字字符串“ profile”,则应这样编写:

- name: "Example"
  command: "./create_user.sh create {{ item.key }} {{ item.value.pwd }}"
  args:
    chdir: "/usr/local/bin/"
  with_dict: "{{ users }}"
  when:
    - verb == 'create'
    - "'profile' in item.value['env']"

如果您尝试使用名为profile的变量,则只需要确保先定义即可。例如,这本剧本正是您所遇到的问题,可以正确运行:

- hosts: localhost
  gather_facts: false
  vars:
    users:
      alice:
        pwd: /home/alice
        env: ""
    verb: create
    profile: ""
  tasks:
    - name: "Example"
      command: "./create_user.sh create {{ item.key }} {{ item.value.pwd }}"
      args:
        chdir: "/usr/local/bin/"
      with_dict: "{{ users }}"
      when:
        - verb == 'create'
        - profile in item.value['env']