web-dev-qa-db-ja.com

ansibleの動的キー名でファクトを設定します

私は似たようなコードのいくつかのチャンクを縮小しようとしています:

- ... multiple things is going here
  register: list_register
- name: Generating list
  set_fact: my_list="{{ list_register.results | map(attribute='ansible_facts.list_item') | list }}"

# the same code repeats...

実際、それらの唯一の違いは、ここではmy_listの代わりに異なるリスト名を使用していることです

実際、私はこれをやりたい:

set_fact:
  "{{ some var }}" : "{{ some value }}"

この投稿 に出くわしましたが、ここで答えが見つかりませんでした。

そうすることは可能ですか、または回避策はありますか?

19
Nick Roz

このサンプルプレイブックをご覧ください。

---
- hosts: localhost
  vars:
    iter:
      - key: abc
        val: xyz
      - key: efg
        val: uvw
  tasks:
    - set_fact: {"{{ item.key }}":"{{ item.val }}"}
      with_items: "{{iter}}"
    - debug: msg="key={{item.key}}, hostvar={{hostvars['localhost'][item.key]}}"
      with_items: "{{iter}}"
20

上記は私にはうまくいきません。最終的に機能するのは

- set_fact:
    example_dict: "{'{{ some var }}':'{{ some other var }}'}"

最終的には明らかです。ハッシュとして解釈される文字列(外側の二重引用符)を作成します。ハッシュでは、キーと値は単一引用符である必要があります(変数置換の内側の単一引用符)。そして最後に、他の文字列と同様に変数を置き換えます。

ステファン

7
user2854753

2018年時点で、ansible v2.7.1を使用すると、投稿で提案する構文は完全に機能します。

少なくとも私の場合、私はこれを役割 "a"で持っています:

- name: Set fact
  set_fact: 
     "{{ variable_name }}": "{{ variable_value }}"

そして、役割 "b"の場合:

- debug:
  msg: "variable_name = {{ variable_name }}"

そして実行は行きます:

TASK [role a : Set fact] *******************************************************
ok: [Host_name] => {
  "ansible_facts": {
    "variable_name": "actual value"
  }, 
  "changed": false
}

...

TASK [role b : debug] **********************************************************
ok: [Host_name] => {}

MSG:

variable_name = actual value
3
theenglishway
- set_fact: '{{ some_var }}={{ some_value }}'

some_var(ファクト名)、セパレーター=の値、およびsome_value(ファクト値)の値を連結することにより、 インラインモジュールパラメーター式 の文字列を作成します。

1
czerny
- set_fact:
    var1={"{{variable_name}}":"{{ some value }}"}

これにより、動的変数のキーと値で変数「var1」が作成されます。


例: AWS Autoscalingグループで動的タグを作成し、次のようなインスタンスのkubernetesタグを作成するためにこれを使用しました。

- name: Dynamic clustertag
  set_fact:
    clustertag={"kubernetes.io/cluster/{{ clustername }}":"owned"}
- name: Create the auto scale group
  ec2_asg:
    .
    .
    .
    tags:
      - "{{ clustertag }}"
0
Arash