在 Ansible 中解析字典键或参数变量
resolve dictionary key or parameter variable in Ansible
在 Ansible 中,如果我尝试使用变量作为参数名称或键名称,它永远不会被解析。例如,如果我有 {{ some_var }}: true
,或者:
template: "{{ resolve_me_to_src }}": "some_src"
变量只会按字面意思使用,永远不会解析。我的具体用例是将其与 ec2 模块一起使用,其中我的一些标签名称存储为变量:
- name: Provision a set of instances
ec2:
group: "{{ aws_security_group }}"
instance_type: "{{ aws_instance_type }}"
image: "{{ aws_ami_id }}"
region: "{{ aws_region }}"
vpc_subnet_id: "{{ aws_vpc_subnet_id }}"
key_name: "{{ aws_key_name }}"
wait: true
count: "{{ num_machines }}"
instance_tags: { "{{ some_tag }}": "{{ some_value }}", "{{ other_tag }}": "{{ other_value }}" }
有什么办法解决这个问题吗?我可以标记我想以某种方式强制评估吗?
这对你有用吗?
(rc=0)$ cat training.yml
- hosts: localhost
tags: so5
gather_facts: False
vars: [
k1: 'key1',
k2: 'key2',
d1: "{
'{{k1}}': 'value1',
'{{k2}}': 'value2',
}",
]
tasks:
- debug: msg="{{item}}"
with_dict: "{{d1}}"
(rc=0)$ ansible-playbook training.yml -t so5
PLAY [localhost] ****************************************************************
PLAY [localhost] ****************************************************************
TASK: [debug msg="{{item}}"] **************************************************
ok: [localhost] => (item={'key': 'key2', 'value': 'value2'}) => {
"item": {
"key": "key2",
"value": "value2"
},
"msg": "{'value': 'value2', 'key': 'key2'}"
}
ok: [localhost] => (item={'key': 'key1', 'value': 'value1'}) => {
"item": {
"key": "key1",
"value": "value1"
},
"msg": "{'value': 'value1', 'key': 'key1'}"
}
PLAY RECAP ********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
(rc=0)$
技巧是用双引号将 dict 声明括起来。 Ansible 将这种未记录(但一致)且糟糕的翻译(ansible 相当于 shell 变量扩展)应用于剧本中的大多数(不是全部)YAML 值(':'
的所有 RHS)。它是将这些字符串以某种未知顺序通过 Jinja2-engine、Python-interpreter 和 ansible-engine 的某种组合。
另一种选择 - 您可以尝试类似的方法:
module_name: "{{ item.key }}={{ item.value }}"
with_items:
- { key: "option", value: "{{ any_value }}" }
请注意,所有内容都是内联的,我使用的是等号 (=),所有内容都用双引号引起来。
在 Ansible 中,如果我尝试使用变量作为参数名称或键名称,它永远不会被解析。例如,如果我有 {{ some_var }}: true
,或者:
template: "{{ resolve_me_to_src }}": "some_src"
变量只会按字面意思使用,永远不会解析。我的具体用例是将其与 ec2 模块一起使用,其中我的一些标签名称存储为变量:
- name: Provision a set of instances
ec2:
group: "{{ aws_security_group }}"
instance_type: "{{ aws_instance_type }}"
image: "{{ aws_ami_id }}"
region: "{{ aws_region }}"
vpc_subnet_id: "{{ aws_vpc_subnet_id }}"
key_name: "{{ aws_key_name }}"
wait: true
count: "{{ num_machines }}"
instance_tags: { "{{ some_tag }}": "{{ some_value }}", "{{ other_tag }}": "{{ other_value }}" }
有什么办法解决这个问题吗?我可以标记我想以某种方式强制评估吗?
这对你有用吗?
(rc=0)$ cat training.yml
- hosts: localhost
tags: so5
gather_facts: False
vars: [
k1: 'key1',
k2: 'key2',
d1: "{
'{{k1}}': 'value1',
'{{k2}}': 'value2',
}",
]
tasks:
- debug: msg="{{item}}"
with_dict: "{{d1}}"
(rc=0)$ ansible-playbook training.yml -t so5
PLAY [localhost] ****************************************************************
PLAY [localhost] ****************************************************************
TASK: [debug msg="{{item}}"] **************************************************
ok: [localhost] => (item={'key': 'key2', 'value': 'value2'}) => {
"item": {
"key": "key2",
"value": "value2"
},
"msg": "{'value': 'value2', 'key': 'key2'}"
}
ok: [localhost] => (item={'key': 'key1', 'value': 'value1'}) => {
"item": {
"key": "key1",
"value": "value1"
},
"msg": "{'value': 'value1', 'key': 'key1'}"
}
PLAY RECAP ********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
(rc=0)$
技巧是用双引号将 dict 声明括起来。 Ansible 将这种未记录(但一致)且糟糕的翻译(ansible 相当于 shell 变量扩展)应用于剧本中的大多数(不是全部)YAML 值(':'
的所有 RHS)。它是将这些字符串以某种未知顺序通过 Jinja2-engine、Python-interpreter 和 ansible-engine 的某种组合。
另一种选择 - 您可以尝试类似的方法:
module_name: "{{ item.key }}={{ item.value }}"
with_items:
- { key: "option", value: "{{ any_value }}" }
请注意,所有内容都是内联的,我使用的是等号 (=),所有内容都用双引号引起来。