我有一个像这样的安全任务:
- 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数组,这是一个网络接口列表,我运行一个脚本并将网络接口作为参数传递给脚本,我的实现不正确,我该怎么做?
答案 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"