Loops 使用循环将变量正确地传递给任务
我是ansible的新手,理解循环有困难。我有以下ansible剧本:Loops 使用循环将变量正确地传递给任务,loops,ansible,Loops,Ansible,我是ansible的新手,理解循环有困难。我有以下ansible剧本: --- - name: Firewall Object Group Manager hosts: all gather_facts: yes tasks: - name: Manage ASA Object Groups asa_og: name: TEST_ANSIBLE_GROUP_1 state: replace group_type:
---
- name: Firewall Object Group Manager
hosts: all
gather_facts: yes
tasks:
- name: Manage ASA Object Groups
asa_og:
name: TEST_ANSIBLE_GROUP_1
state: replace
group_type:
host_ip:
- 127.0.0.1
- 127.0.0.2
ip_mask:
我的目标是能够管理多个ASA对象组。如果没有循环,我的游戏会像这样
---
- name: Firewall Object Group Manager
hosts: all
gather_facts: yes
tasks:
- name: Manage ASA Object Groups
asa_og:
name: TEST_ANSIBLE_GROUP_1
state: replace
group_type:
host_ip:
- 127.0.0.1
- 127.0.0.2
ip_mask:
- name: Manage ASA Object Groups
asa_og:
name: TEST_ANSIBLE_GROUP_2
state: replace
group_type:
host_ip:
- 127.0.0.3
- 127.0.0.4
ip_mask:
- name: Manage ASA Object Groups
asa_og:
name: TEST_ANSIBLE_GROUP_3
state: replace
group_type:
host_ip:
- 127.0.0.5
- 127.0.0.6
ip_mask:
……等等
我对ansible循环的理解是,我应该能够调用任务一次并循环变量。经过几个小时的研究,我的剧本现在看起来是这样的:
---
- name: Firewall Object Group Manager
hosts: all
gather_facts: yes
vars:
Object_Groups:
- name: 'TEST_ANSIBLE_GROUP'
host_ip:
- 127.0.0.1
- 127.0.0.2
group_type: 'network-object'
- name: 'TEST_ANSIBLE_GROUP_2'
host_ip:
- 127.0.0.3
- 127.0.0.4
group_type: 'network-object'
- name: 'TEST_ANSIBLE_GROUP_3'
host_ip:
- 127.0.0.5
- 127.0.0.6
group_type: 'network-object'
tasks:
- name: Manage ASA Object Groups
asa_og:
name: "{{ item.0.name }}"
state: replace
group_type: "{{ item.0.group_type }}"
host_ip: "{{ item.0.host_ip }}"
ip_mask: "{{ item.0.ip_mask | default([]) }}"
loop:
- "{{ Object_Groups }}"
以下是我运行播放时的调试:
$ ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook -i inventory.yml -k stackof.yml -v -l FW01
Using /etc/ansible/ansible.cfg as config file
SSH password:
PLAY [Firewall Object Group Manager] **********************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [FW01]
TASK [Manage ASA Object Groups] ***************************************************************************************************************************************
changed: [FW01] => (item=[{u'name': u'TEST_ANSIBLE_GROUP', u'group_type': u'network-object', u'host_ip': [u'127.0.0.1', u'127.0.0.2']}, {u'name': u'TEST_ANSIBLE_GROUP_2', u'group_type': u'network-object', u'host_ip': [u'127.0.0.3', u'127.0.0.4']}, {u'name': u'TEST_ANSIBLE_GROUP_3', u'group_type': u'network-object', u'host_ip': [u'127.0.0.5', u'127.0.0.6']}]) => {
"ansible_loop_var": "item",
"changed": true,
"commands": [
"object-group network TEST_ANSIBLE_GROUP",
"network-object host 127.0.0.2",
"network-object host 127.0.0.1",
"no network-object host 127.0.0.8",
"no network-object host 127.0.0.7",
"no network-object host 127.0.0.5"
],
"item": [
{
"group_type": "network-object",
"host_ip": [
"127.0.0.1",
"127.0.0.2"
],
"name": "TEST_ANSIBLE_GROUP"
},
{
"group_type": "network-object",
"host_ip": [
"127.0.0.3",
"127.0.0.4"
],
"name": "TEST_ANSIBLE_GROUP_2"
},
{
"group_type": "network-object",
"host_ip": [
"127.0.0.5",
"127.0.0.6"
],
"name": "TEST_ANSIBLE_GROUP_3"
}
]
}
PLAY RECAP ************************************************************************************************************************************************************
FW01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
看起来Ansible可以看到所有变量,但它没有使用我为下一个对象组定义的变量再次运行任务,然后再次为第三个对象组定义变量。我似乎不知道我做错了什么
一旦我能够正确地循环变量,我的意图就是将变量放在vars/main.yml
文件中,这样我就可以在一个地方管理所有对象组变量
作为参考,以下是我正在使用的Ansible模块的链接:
如果您更改此选项,该怎么办:
循环:
-“{{Object_Groups}}”
致:
循环:
-“{TEST_ANSIBLE_GROUP_1}”
-“{TEST_ANSIBLE_GROUP_2}”
-“{TEST_ANSIBLE_GROUP_3}”
-“{TEST_ANSIBLE_GROUP_4}”
变量Object\u Groups
是包含三个dict的单个项的列表。因此,当您循环时,ansible只运行一次。可能还有其他选项,但在此处发布两个选项来修改任务,以便循环遍历所有DICT
选项#1:对_项使用
-调试:
msg:{item.name}{{item.group_type}{{{item.host_ip}}{{item.ip_mask}默认([])}”
与_项一起:“{{Object_Groups}”
选项2:使用循环
-调试:
msg:{item.name}{{item.group_type}{{{item.host_ip}}{{item.ip_mask}默认([])}”
循环:{{Object_Groups}展平(1)}”
上述两个选项都提供:
TASK [debug] *******************************************************************************************************************************************************************************
ok: [localhost] => (item={'name': 'TEST_ANSIBLE_GROUP', 'host_ip': ['127.0.0.1', '127.0.0.2'], 'group_type': 'network-object'}) =>
msg: TEST_ANSIBLE_GROUP network-object ['127.0.0.1', '127.0.0.2'] []
ok: [localhost] => (item={'name': 'TEST_ANSIBLE_GROUP_2', 'host_ip': ['127.0.0.3', '127.0.0.4'], 'group_type': 'network-object'}) =>
msg: TEST_ANSIBLE_GROUP_2 network-object ['127.0.0.3', '127.0.0.4'] []
ok: [localhost] => (item={'name': 'TEST_ANSIBLE_GROUP_3', 'host_ip': ['127.0.0.5', '127.0.0.6'], 'group_type': 'network-object'}) =>
msg: TEST_ANSIBLE_GROUP_3 network-object ['127.0.0.5', '127.0.0.6'] []
请参阅和过滤器的详细信息