首页 > 解决方案 > 使用字典变量提供任务参数 (Ansible)

问题描述

我正在尝试使用 Ansible 中的字典提供所有任务参数。早些时候,该args模块(现已弃用)是一种方便的方法。我试图放入循环中的一些任务的参数比其他任务少,并且由于我不希望在我的剧本中暴露任何变量,我正在寻找一个与该方法密切匹配的args解决方案。

字典变量(注意:最后一个元素没有 'opts' 键/参数):

lvm_vars:
    - {vg: {{ lvm_names.data_vol_group }} , lv: {{ lvm_names.index_lv }} , size: 5G, opts: -i 3 -I 256}
    - {vg: {{ lvm_names.data_vol_group }} , lv: {{ lvm_names.data_lv }} , size: 5G, opts: -i 3 -I 256}
    - {vg: {{ lvm_names.data_vol_group }} , lv: {{ lvm_names.wal_lv }} , size: 5G, opts: -i 3 -I 256}
    - {vg: {{ lvm_names.data_vol_group }} , lv: {{ lvm_names.tblspc_lv }} , size: 5G, opts: -i 3 -I 256}
    - {vg: {{ lvm_names.backup_vol_group }} , lv: {{ lvm_names.backup_lv }} , size: 5G}

args 解决方案:

- name: Create LVs ({{ item.lv }})
  lvol:
  args: "{{ item }}"
  with_items: "{{ lvm_vars }}"

最终展开的任务应该是什么样子:

- name: Create LVs
  lvol:
    vg: {{ lvm_names.data_vol_group }}
    lv: {{ lvm_names.index_lv }}
    size: 5G
    opts: -i 3 -I 256
- name: Create LVs
  lvol:
    vg: {{ lvm_names.data_vol_group }}
    lv: {{ lvm_names.data_lv }}
    size: 5G
    opts: -i 3 -I 256
- name: Create LVs
  lvol:
    vg: {{ lvm_names.data_vol_group }}
    lv: {{ lvm_names.wal_lv }}
    size: 5G
    opts: -i 3 -I 256
- name: Create tblspc LV
  lvol:
    vg: {{ lvm_names.data_vol_group }}
    lv: {{ lvm_names.tblspc_lv }}
    size: 5G
    opts: -i 3 -I 256
- name: Create LVs
  lvol:
    vg: {{ lvm_names.backup_vol_group }}
    lv: {{ lvm_names.backup_lv }}
    size: 5G

我也可以只提供字典中的参数值,但这是有问题的,因为我字典中的最后一项没有使用“opts”参数。所以如果我尝试做这样的事情:

- name: Create LVs ({{ item.lv }})
  lvol:
    vg: "{{ item.vg }}"
    lv: "{{ item.lv }}"
    size: "{{ item.size }}"
    opts: "{{ item.opts }}"
  with_items: "{{ lvm_vars }}"

我显然得到了一个错误,因为最后一项没有定义“item.opts”。

标签: ansible

解决方案


您正在寻找的是default具有特殊值的过滤器omit

默认情况下,Ansible 需要模板表达式中所有变量的值。但是,您可以将特定变量设为可选。例如,您可能希望对某些项目使用系统默认值并控制其他项目的值。要使变量可选,请将默认值设置为特殊变量omit

来源:https ://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#making-variables-optional

- name: Create LVs ({{ item.lv }})
  lvol:
    vg: "{{ item.vg }}"
    lv: "{{ item.lv }}"
    size: "{{ item.size }}"
    opts: "{{ item.opts | default(omit) }}"
  with_items: "{{ lvm_vars }}"

有了这个,如果你的item字典不包含opts键,整个optslvol将被从字典中删除,所以你的最后一个循环是:

- name: Create LVs (lvm_names.backup_lv)
  lvol:
    vg: lvm_names.backup_vol_group
    lv: lvm_names.backup_lv
    size: 5G

推荐阅读