显式合并清单变量的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第三方库


热门话题
由于测试失败,java testcontainers maven构建失败   java实现jacobi算法实现laplace方程   java中的多线程:如何在不等待所有线程使用ExecutorService完成任务的情况下终止所有线程的执行?   java Hello World不在Android Studio 3中工作   ubuntu Tomcat7的Java版本不正确   java Javafx内存泄漏   对于手动实现的Spring数据存储库方法,我应该使用Java8默认方法吗?   googleappengine中的java添加过滤查询   html当使用JSOUP库在Java中读取标签时,如何保留标签(如<br>、<ul>、<li>、<p>等)的含义?   编码为什么jasper生成的报告在Java中不显示西里尔语(保加利亚语)?   java有没有办法隐藏当前位置和jdk动作?   java找出编译原型文件的版本   有没有办法在运行时更改java方法的访问修饰符?   语法字符串。。。Java中的参数   java数组元素在添加其他元素时会相互覆盖   eclipse中的java GWT项目   java如何为spring rest模板请求将动态json属性名映射到jackson   java无法在Windows 10上找到特定的JDK   在xml字符串和java字符串之间提取正则表达式子字符串