ansible - 使用字典变量提供任务参数 (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”。
解决方案
您正在寻找的是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
键,整个opts
键lvol
将被从字典中删除,所以你的最后一个循环是:
- name: Create LVs (lvm_names.backup_lv)
lvol:
vg: lvm_names.backup_vol_group
lv: lvm_names.backup_lv
size: 5G
推荐阅读
- django - Makemigrations 给出 ValueError: too many values to unpack
- filter - ExtJS:如何通过过滤隐藏商店中的特定数据?
- javascript - 在段落中添加多个“阅读更多”链接 (readmore.js)
- python - Python中的dict和list
- angular - Angular 简单指令 ngIf
- reporting-services - SSRS 在数字和字母字符之间插入空格
- c# - 从 SuperPower 中的关键字获取字符串
- ios - 从当前登录的用户 Firebase 中检索数据
- r - 在 R 中拟合样条函数以从每月值中插入每日值
- sql - XMLELEMENT SQL 函数名是否允许冒号