Ansibleで辞書キーまたはパラメータ変数を解決する 質問する

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 }}" }

これを回避する方法はありますか? 何らかの方法で評価を強制したいことをマークできますか?

ベストアンサー1

これはあなたにとって有効でしょうか?

(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 のもの) を、':'プレイブック内のほとんどの (すべてではない) YAML 値 (の右側のすべて) に適用します。これは、これらの文字列を Jinja2 エンジン、Python インタープリター、および ansible エンジンに何らかの未知の順序で通す組み合わせです。

おすすめ記事