ansible如何在for循环中使用变量

时间:2015-11-16 11:00:51

标签: yaml ansible

我有一个像这样的安全任务:

- name: coreos network configuration
    {% for interface in argument['interfaces'] %}
      {% if argument[interface]['role'] == 'ingest' %}
  script: netconfiginput.sh -i {{interface}} #incorrect, how to get the value of the interface variable of the for loop?
      {% endif %}
    {% endfor %}

在运行此ansible任务时,我传递了一个JSON字符串参数:

ansible-playbook --extra-vars 'argument={"interfaces":["eno1","eno2","ep8s0"],"eno2":{"role":"ingest"}}' network-config.yml

我想要做的是,当调用接口的interfaces role时,循环遍历名为ingest的JSON数组,这是一个网络接口列表,我运行一个脚本并将网络接口作为参数传递给脚本,我的实现不正确,我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要使用with_items并将变量名称替换为item

一个粗略的例子:

name: task name
script: netconfiginput.sh -i {{ item }}
with_items: interfaces_array
when: some_role == 'ingest'

要了解您要发送的数据类型,请使用以下命令:

name: debugging
debug:
  var: argument

除其他事项外,这应该向您展示Ansible是否正在考虑变量结构有效数组的部分内容。

答案 1 :(得分:1)

Jinja2可以在ansible模板中使用,而不是在playbooks中使用。 Ansible支持循环哈希。你可以试试这个:

---
- hosts: <test_servers> # replace with your hosts
  vars:
    interfaces:
      eno1:
        role: null
      eno2:
        role: ingest
      ep8s0:
        role: null
  tasks:
    - name: coreos network configuration
      script: netconfiginput.sh -i {{ item.key }}
      with_dict: "{{interfaces}}"
      when: item.value.role == "ingest"