在剧本中转换字典键

时间:2016-10-05 19:35:00

标签: ansible ansible-playbook

我有一个现有的playbook变量字典定义如下:

vars:
  resource_tags: {
    Name: "some name"
    Service: "some service"
  }

这用于对此表单中的任务的各种调用。但是在另一项任务中,我需要采用不同的格式,而不是硬编码,我想知道它是否可以在任务中构建。

我需要它看起来像:

  {
    "tag:Name": "some name"
    "tag:Service": "some service"
  }

我尝试使用with_dict进行迭代并使用combine设置事实:

  - set_fact:
        ec2_remote_facts_filter: "{{ ec2_remote_facts_filter | default({}) | combine( { 'tag:'item.name: item.val } ) }}"
    with_dict: "{{ ec2_count_resource_tags }}"

显然这不起作用。

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

如果你不介意一点hackery:

- debug: msg="{{ resource_tags | to_json(indent=0) | regex_replace('\n\"','\n\"tag:') }}"

这将使用indent=0将您的dict转换为JSON格式的字符串,这意味着每个键都将从新行开始;然后在每一行的第一个双引号后插入tag: 因为结果是有效的JSON,Ansible模板引擎会将它转换回dict作为变量替换的最后一步,为您提供:

ok: [localhost] => {
    "msg": {
        "tag:Name": "some name",
        "tag:Service": "some service"
    }
}

我认为如果您的值中有新行,可能会出现一些极端情况,但一般来说应该没问题。

答案 1 :(得分:1)

也许您需要一个自定义查找插件。

1)编辑文件ansible.cfg并取消注释键' lookup_plugins'有价值' ./ plugins / lookup'

2)创建一个名为' ec2remote.py'的插件文件。在' ./ plugins / lookup'

3)在你的剧本中使用它:

- debug:
    msg: "{{ item }}"
  with_ec2remote: "{{ ec2_count_resource_tags }}"

4)实现你的ec2remote.py(很多例子here

class LookupModule(LookupBase):
  def run(self, terms, **kwargs):
    result = {}
    for k,v in terms.items():
       result["tag:"+k] = v
    return result

通常,我更喜欢开发易于使用和可测试的插件,从而保留可理解的剧本。