![如何在循环任务之间共享 ansible 变量](https://linux22.com/image/788193/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%BB%BB%E5%8A%A1%E4%B9%8B%E9%97%B4%E5%85%B1%E4%BA%AB%20ansible%20%E5%8F%98%E9%87%8F.png)
我正在尝试使用他们的 Ansible 创建 Fortinet FortiManager 自动化收藏。
我已经创建了一个循环运行的动态 ADOM 创建任务,现在我正尝试运行另一个动态任务,该任务在所有创建的 ADOM 中创建 CLI 模板。我面临的问题是,我必须在循环运行的不同任务中多次定义 ADOM 名称,但我想做的是在循环任务之间继承/共享 ADOM 名称,这样我就不必为每个循环任务使用另一个变量名重复定义它。
这是我的带有描述的代码:
- 我创建了一个包含 ADOM 创建任务的任务,并针对我需要创建的每个 ADOM 循环运行该任务。我需要这样做是因为 FortiManager ADOM 创建任务状态结果没有给出“好的”如果 ADOM 已经创建,但失败了。所以我必须像这样构建它。
---
name: 'Setup ADOMS'
loop: '{{ fmg_adom_list }}'
loop_control:
loop_var: '__adom'
label: '{{ __adom.fmg_adom_name }}'
ansible.builtin.include_tasks: 'fmg_setup_adom.yml'
- 这是 ADOM 创建任务,检查 ADOM 是否存在以跳过创建
- name: Check if ADOM exists
fortinet.fortimanager.fmgr_fact:
facts:
selector: "dvmdb_adom"
params:
adom: "{{ __adom.fmg_adom_name }}"
register: fmg_adom_check
no_log: false
ignore_errors: true
changed_when: "fmg_adom_check.rc != 0"
failed_when: "fmg_adom_check.rc == -3"
- name: "Create ADOM {{ __adom.fmg_adom_name }}"
fortinet.fortimanager.fmgr_dvmdb_adom:
bypass_validation: "{{ fmg_bypass_validation }}"
state: "{{ __adom.fmg_adom_state | default('present') }}"
dvmdb_adom:
name: "{{ __adom.fmg_adom_name | replace(' ', '_') }}"
desc: "{{ __adom.fmg_adom_desc }}"
os_ver: "{{ __adom.fmg_adom_os_ver | default(7.0) | float }}"
mode: "{{ __adom.fmg_adom_mode | default('gms') }}"
restricted_prds: "{{ __adom.fmg_adom_restricted_prds | default('fos') }}"
state: " {{ __adom.fmg_dvmdb_adom_state | default(1) | int }}"
flags: "{{ __adom.fmg_adom_flags }}"
register: fmg_adom_create
when: fmg_adom_check.meta.response_message == "Object does not exist"
- name: Print ADOM creation error message
ansible.builtin.debug:
msg: "Failed to create ADOM: {{ fmg_adom_check.meta.response_message }}"
when: fmg_adom_create is failed
- name: Print ADOM already exists message
ansible.builtin.debug:
msg: "ADOM {{ __adom.fmg_adom_name }} already exists"
when: fmg_adom_create is skipped
- name: Print ADOM created successfully message
ansible.builtin.debug:
msg: "ADOM {{ __adom.fmg_adom_name }} created successfully"
when: fmg_adom_create is succeeded and fmg_adom_create is not skipped
- 这是 CLI 模板任务,它给了我一个错误:
The error was: 'list object' has no attribute 'fmg_adom_name'
。我不知道如何让任务使用ADOM 创建变量列表,而不是像 ADOM 是强制变量fmg_adom_name
那样需要用新名称重复变量。fmg_tmpl_grp_adom
---
- name: Create CLI template group {{ item.fmg_tmpl_grp_name }} to ADOM {{ item.fmg_adom_name }}
fortinet.fortimanager.fmgr_templategroup:
workspace_locking_adom: "{{ item.fmg_adom_name }}"
adom: "{{ item.fmg_adom_name }}"
state: "{{ item.fmg_tmpl_grp_state }}"
templategroup:
name: "{{ item.fmg_tmpl_grp_name }}"
description: "{{ item.fmg_tmpl_grp_desc }}"
member: "{{ item.fmg_tmpl_grp_mbr | list }}"
loop: "{{ fmg_tmpl_grp_list | zip(fmg_adom_list) | list }}"
- 这些是我在剧本中定义的变量
# ADOM Creation variables
fmg_adom_list:
- fmg_adom_name: "ADOM_One"
fmg_adom_desc: "ADOM One"
fmg_adom_flags:
- no_vpn_console
- per_device_wtp
- per_device_fsw
# ADOM CLI Template group creation varibles
fmg_tmpl_grp_list:
- fmg_tmpl_grp_state: present
fmg_tmpl_grp_name: "Test"
fmg_tmpl_grp_desc: "Test group"
fmg_tmpl_grp_mbr:
- "test_cli_template"
我希望我已经尽可能清楚且易于理解地解释了自己。
谢谢你!
答案1
您将两个列表合并在一起,这意味着您最终会得到一个二元组列表,即列表的每个元素本身都是一个列表。因此,访问fmg_adom_name
列表项的属性(而不是预期的字典)会导致观察到的错误。
您需要访问[0]
adom 信息和[1]
模板信息。
- name: Create CLI template group {{ item[1].fmg_tmpl_grp_name }} to ADOM {{ item[0].fmg_adom_name }}
fortinet.fortimanager.fmgr_templategroup:
workspace_locking_adom: "{{ item[0].fmg_adom_name }}"
adom: "{{ item[0].fmg_adom_name }}"
state: "{{ item[1].fmg_tmpl_grp_state }}"
templategroup:
name: "{{ item[1].fmg_tmpl_grp_name }}"
description: "{{ item[1].fmg_tmpl_grp_desc }}"
member: "{{ item[1].fmg_tmpl_grp_mbr }}"
loop: "{{ fmg_tmpl_grp_list | zip(fmg_adom_list) }}"
附注:这会将第一个 adom 映射到第一个模板,将第二个 adom 映射到第二个模板,等等。如果这不是您想要的,那么zip
就不是正确的过滤器。