我有一个现有的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 }}"
显然这不起作用。
这甚至可能吗?
答案 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
通常,我更喜欢开发易于使用和可测试的插件,从而保留可理解的剧本。