如何在循环任务之间共享 ansible 变量

如何在循环任务之间共享 ansible 变量

我正在尝试使用他们的 Ansible 创建 Fortinet FortiManager 自动化收藏

我已经创建了一个循环运行的动态 ADOM 创建任务,现在我正尝试运行另一个动态任务,该任务在所有创建的 ADOM 中创建 CLI 模板。我面临的问题是,我必须在循环运行的不同任务中多次定义 ADOM 名称,但我想做的是在循环任务之间继承/共享 ADOM 名称,这样我就不必为每个循环任务使用另一个变量名重复定义它。

这是我的带有描述的代码:

  1. 我创建了一个包含 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'
  1. 这是 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
  1. 这是 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 }}"
  1. 这些是我在剧本中定义的变量
# 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就不是正确的过滤器。

相关内容