显式合并清单变量的ansible操作插件

ansible-merge-vars的Python项目详细描述


ansible_merge_vars:ansible的操作插件

TravisPyPI

一个ansible插件,可以将上下文中的所有变量合并为一个特定的后缀(列表 或仅dicts),并创建包含此合并结果的新变量。 这是一个ansible操作插件,基本上是一个运行 在运行ansible的计算机上,而不是在ansible所在的主机上 资源调配。

要求

此插件要求ansibe release>;=2.1.0.0。

此外,有些版本的ansible由于这些版本中的错误而无法使用此插件:

安装

  1. 在Ansible Playbooks中选择要用来调用此插件的名称。 本文档假设您使用的是名称merge_vars

  2. pip install ansible_merge_vars

  3. 在运行ansible的目录中创建一个action_plugins目录。

    默认情况下,ansible将在action_plugins中查找操作插件。 与正在运行的行动手册相邻的文件夹。有关此的详细信息,或 更改ansibe查找操作插件的位置,请参见the Ansible docs

  4. action_plugins目录,只有一行:

    from ansible_merge_vars import ActionModule
    
  5. 小于2.4时:

    1. 如果尚未创建library目录,请创建该目录:

      mkdir -p library
      
    2. library目录中创建一个空的merge_vars(或您选择的任何名称)文件:

      touch library/merge_vars
      

Ansible Action插件通常与模块(在 正在设置主机),Ansible将自动运行操作插件 在任务中调用同名模块时。在Ansible 2.4之前, 如果你想在我们的任务中调用一个名为merge_vars的动作插件, 在ansibe检查的地方需要一个名为merge_vars的空文件 对于自定义模块;默认情况下,这是一个library目录,与 运行剧本。

用法

要合并的变量必须以__to_merge作为后缀。 它们可以定义在库存的任何地方,或通过任何其他方式;只要 因为它们在运行剧本的上下文中,所以它们将被合并。

合并dicts

假设我们在group_vars中有一个带文件的组someenvironmentusers.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_usersvar(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)
  • 任何其他值:仅替换(使用最后一个)

模块选项

parameterrequireddefaultchoicescomments
suffix_to_mergeyesSuffix of variables to merge. Must end with ^{}.
merged_var_nameyes<identifier>Name of the target variable.
expected_typeyesdict, listExpected type of the merged variable (one of dict or list)
dedupnoyesyes / noWhether to remove duplicates from lists (arrays) after merging.
cacheablenonoyes / noIf set to ^{}, the merged variable will be stored in the facts cache
recursive_dict_mergenonoyes / noWhether 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发布的。通过参与这个项目,你同意遵守它的条款。

这些是在本地处理此项目的唯一先决条件:

  1. 您已经安装了Pipenv
  2. .python-version中有python版本 已安装并在您的路径上(可能是 pyenv

开发工作流可能如下所示:

  1. 克隆此存储库

  2. 运行make deps

    • 这将使用Pipenv来安装 构建发布和运行测试所需的依赖项。
  3. 运行make test-all

    • 这将使用tox运行 针对python版本和ansible的不同组合的测试 释放。
    • 它还将使用a script来查询 PyPI用于ansible的最新版本,以及 如果它们不存在,请将它们添加到tox.ini文件中。
  4. 更新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
...
```

如果你对要添加或改进的内容有任何想法,或者发现任何要修复的错误,我们都会全神贯注!只有几条准则:

  1. 请编写或更新测试(基于示例的测试、基于属性的测试 测试,或两者兼有)添加、更改或删除的任何代码。

  2. 请添加一个示例剧本或更新现有示例脚本 examples文件夹。这些示例剧本用作集成 测试此插件。

  3. 请确保^ {CD36>}退出零。这运行一个代码linter, 所有测试,以及针对所有支持版本的所有示例 关于巨蟒和安西伯。

  4. 如果绒线看起来太烦人,那可能是!做你想做的事 需要在这个存储库根目录的.pylintrc中进行维护 神志正常。把它加到你的公关中,我们很可能会接受它。

合并愉快!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Esper中声明Classtype实例变量并调用实例方法时未调用java实例方法   java Android真的很慢   macos在Mac上用Java播放声音   java如何在springboot中生成clientid和clientsecret并存储在数据库中?   返回假条件的java方法   数组在Java中截断同步ArrayList的正确方法   java HashMap<Long,String>和HashMap<>之间有什么区别?   正在寻找允许按名称读取列的java CSV库   HQL Hibernate查询中的java左连接   java以编程方式添加可绘制图像的最佳方法是什么?   已使用NetworkImageView下载的安卓加载图像上的java截击不起作用   java CORBA通知订阅(错误:org.omg.CORBA.MARSHAL:vmcid:0x0次要代码:0已完成:否)   Java BufferedReader openvms   java是搜索字符串中的一个字母并在字母前加上“a”的最佳算法?   由于测试依赖关系,java Gradle Spring云流项目未生成   Java程序中的数组ArrayIndexOutOfBoundsException,用于检查double是否为负数   java Android/RxJava如何链接网络请求并在失败时重试   java告诉OpenEJB忽略MDB   java如何在不迁移的情况下在room数据库中添加表