显式合并清单变量的ansible操作插件
ansible-merge-vars的Python项目详细描述
ansible_merge_vars:ansible的操作插件
一个ansible插件,可以将上下文中的所有变量合并为一个特定的后缀(列表 或仅dicts),并创建包含此合并结果的新变量。 这是一个ansible操作插件,基本上是一个运行 在运行ansible的计算机上,而不是在ansible所在的主机上 资源调配。
要求
此插件要求ansibe release>;=2.1.0.0。
此外,有些版本的ansible由于这些版本中的错误而无法使用此插件:
安装
在Ansible Playbooks中选择要用来调用此插件的名称。 本文档假设您使用的是名称
merge_vars
。pip install ansible_merge_vars
在运行ansible的目录中创建一个
action_plugins
目录。默认情况下,ansible将在
action_plugins
中查找操作插件。 与正在运行的行动手册相邻的文件夹。有关此的详细信息,或 更改ansibe查找操作插件的位置,请参见the Ansible docs。在
action_plugins
目录,只有一行:from ansible_merge_vars import ActionModule
小于2.4时:
如果尚未创建
library
目录,请创建该目录:mkdir -p library
在
library
目录中创建一个空的merge_vars
(或您选择的任何名称)文件:touch library/merge_vars
Ansible Action插件通常与模块(在
正在设置主机),Ansible将自动运行操作插件
在任务中调用同名模块时。在Ansible 2.4之前,
如果你想在我们的任务中调用一个名为merge_vars
的动作插件,
在ansibe检查的地方需要一个名为merge_vars
的空文件
对于自定义模块;默认情况下,这是一个library
目录,与
运行剧本。
用法
要合并的变量必须以__to_merge
作为后缀。
它们可以定义在库存的任何地方,或通过任何其他方式;只要
因为它们在运行剧本的上下文中,所以它们将被合并。
合并dicts
假设我们在group_vars
中有一个带文件的组someenvironment
users.yml
,包含以下内容:
users__someenvironment_users__to_merge:user1:bobuser2:henry
在groups_vars
中有一个somedatacenter
组和一个users.yml
文件
内容:
users__somedatacenter_users__to_merge:user3:sallyuser4:jane
我们正在和这两个组中的主机进行比赛。 那么这个任务:
name:Merge user varsmerge_vars:suffix_to_merge:users__to_mergemerged_var_name:merged_usersexpected_type:'dict'
将设置一个merged_users
var(fact)可用于所有后续任务,如下所示(如果要在原始yaml中声明):
merged_users:user1:bobuser2:henryuser3:sallyuser4:jane
注意,变量按其名称的字母顺序合并 后面的dict的值替换前面dict的值。所以这个设置:
users__someenvironment_users__to_merge:user1:bobuser2:jekyll
users__somedatacenter_users__to_merge:user2:hydeuser3:sally
name:Merge user varsmerge_vars:suffix_to_merge:users__to_mergemerged_var_name:merged_usersexpected_type:'dict'
将设置一个类似这样的merged_users
变量(如果要在原始yaml中声明的话):
merged_users:user1:bobuser2:jekylluser3:sally
伟大的力量带来伟大的责任…
合并列表
假设我们有一个带open_ports.yml
文件的someenvironment
组
看起来是这样:
open_ports__someenvironment_open_ports__to_merge:-1-2-3
还有一个somedatacenter
组,它有一个open_ports.yml
文件,看起来像这样:
open_ports__somedatacenter_open_ports__to_merge:-3-4-5
那么这个任务:
name:Merge open portsmerge_vars:suffix_to_merge:open_ports__to_mergemerged_var_name:merged_portsexpected_type:'list'
将设置一个类似这样的merged_ports
事实(因为变量按字母顺序合并):
merged_ports:-3-4-5-1-2
注意,3
只在合并结果中出现一次。默认情况下,这个
merge_vars
插件将对生成的合并值进行重复数据消除。如果你不想
要消除合并值的重复,必须声明dedup
参数:
name:Merge open portsmerge_vars:suffix_to_merge:open_ports__to_mergemerged_var_name:merged_portsdedup:falseexpected_type:'list'
它将设置这个事实:
merged_ports:-3-4-5-1-2-3
关于dedup
:
- 它没有合并的变量是字典时的效果。
递归合并
在处理复杂的数据结构时,可能需要进行深层(递归)合并。
假设您有定义要添加的用户列表的变量,并选择应具有管理员权限的用户:
users__someenvironment_users__to_merge:users:-bob-henryadmins:-bob
以及
users__somedatacenter_users__to_merge:users:-sally-janeadmins:-sally
您可以请求递归合并:
name:Merge user varsmerge_vars:suffix_to_merge:users__to_mergemerged_var_name:merged_usersexpected_type:'dict'recursive_dict_merge:True
得到:
merged_users:users:-sally-jane-bob-henryadmins:-sally-bob
当合并字典和相同的关键字存在时,递归合并检查值的类型:
- 如果输入值是一个列表,则将值合并为列表(merge_list)
- 如果条目值是dict,它将值(递归地)合并为dict(merge_dict)
- 任何其他值:仅替换(使用最后一个)
模块选项
parameter | required | default | choices | comments |
---|---|---|---|---|
suffix_to_merge | yes | Suffix of variables to merge. Must end with ^{ | ||
merged_var_name | yes | <identifier> | Name of the target variable. | |
expected_type | yes | dict, list | Expected type of the merged variable (one of dict or list) | |
dedup | no | yes | yes / no | Whether to remove duplicates from lists (arrays) after merging. |
cacheable | no | no | yes / no | If set to ^{ |
recursive_dict_merge | no | no | yes / no | Whether to do deep (recursive) merging of dictionaries, or just merge only at top level and replace values |
详细信息
使用-v
运行ansible playbook将导致此插件输出
正在合并哪些键:
PLAY [Example of merging lists] ************************************************
TASK [Merge port vars] *********************************************************
Merging vars in this order: [ u'group1_ports__to_merge', u'group2_ports__to_merge', u'group3_ports__to_merge']
ok: [localhost] => {"ansible_facts": {"merged_ports": [22, 1111, 443, 2222, 80]}, "changed": false}
TASK [debug] *******************************************************************
ok: [localhost] => {
"merged_ports": [
22,
1111,
443,
2222,
80
]
}
PLAY RECAP *********************************************************************
localhost : ok=6 changed=0 unreachable=0 failed=0
手册示例
在examples
目录中有一些示例剧本,展示了
各种各样的功能在实际的可翻译剧本的上下文中工作。这些
示例剧本作为此插件的测试套件的一部分运行;如果
想自己运行它们,请查看Contributing
有关如何运行测试套件的说明。
贡献
请注意,此项目是用Contributor Code of Conduct发布的。通过参与这个项目,你同意遵守它的条款。
这些是在本地处理此项目的唯一先决条件:
- 您已经安装了Pipenv。
- 在.python-version中有python版本 已安装并在您的路径上(可能是 pyenv
开发工作流可能如下所示:
克隆此存储库
运行
make deps
- 这将使用Pipenv来安装 构建发布和运行测试所需的依赖项。
运行
make test-all
更新
tox.ini
文件并对所有 ansible版本和python版本的组合需要很多时间。 要只运行一个组合,可以列出所有组合 提供并告诉TOX只对一个组合运行测试:
$ pipenv run tox -l
py27-ansible-2.1.0.0
py27-ansible-2.1.1.0
py27-ansible-2.1.2.0
py27-ansible-2.1.3.0
py27-ansible-2.2.0.0
py27-ansible-2.2.1.0
...
py35-ansible-2.5.1
py35-ansible-2.5.2
py36-ansible-2.5.0
py36-ansible-2.5.1
py36-ansible-2.5.2
...
$ pipenv run tox -e py36-ansible-2.5.2
...
```
如果你对要添加或改进的内容有任何想法,或者发现任何要修复的错误,我们都会全神贯注!只有几条准则:
请编写或更新测试(基于示例的测试、基于属性的测试 测试,或两者兼有)添加、更改或删除的任何代码。
请添加一个示例剧本或更新现有示例脚本
examples
文件夹。这些示例剧本用作集成 测试此插件。请确保^ {CD36>}退出零。这运行一个代码linter, 所有测试,以及针对所有支持版本的所有示例 关于巨蟒和安西伯。
如果绒线看起来太烦人,那可能是!做你想做的事 需要在这个存储库根目录的
.pylintrc
中进行维护 神志正常。把它加到你的公关中,我们很可能会接受它。
合并愉快!