example - ansible playbook hosts
resolver clave de diccionario o variable de parĂ¡metro en Ansible (2)
Funcionara para ti?
(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)$
El truco es envolver la declaración de dict con comillas dobles. Ansible aplica esta traducción no documentada (pero consistente) y de mala calidad (el equivalente de ansible de la expansión de variable de shell) a la mayoría (no todos) de los valores YAML (todo lo que RHS indica '':''
) en el libro de jugadas. Es una combinación de poner estas cadenas a través del motor Jinja2, el intérprete Python y el motor ansible en algún orden desconocido.
En Ansible, si trato de usar una variable como nombre de parámetro o nombre de clave, nunca se resuelve. Por ejemplo, si tengo {{ some_var }}: true
, o:
template: "{{ resolve_me_to_src }}": "some_src"
las variables se utilizarán literalmente y nunca se resolverán. Mi caso de uso específico es usar esto con el módulo ec2, donde algunos de mis nombres de etiquetas se almacenan como variables:
- 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 }}" }
¿Hay alguna manera de evitar esto? ¿Puedo marcar que quiero forzar la evaluación de alguna manera?
Otra opción: puedes probar algo como:
module_name: "{{ item.key }}={{ item.value }}"
with_items:
- { key: "option", value: "{{ any_value }}" }
Tenga en cuenta que todo está en línea y que estoy usando un igual (=) y que todo está envuelto con comillas dobles.