私は似たようなコードのいくつかのチャンクを縮小しようとしています:
- ... 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 }}"
この投稿 に出くわしましたが、ここで答えが見つかりませんでした。
そうすることは可能ですか、または回避策はありますか?
このサンプルプレイブックをご覧ください。
---
- 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}}"
上記は私にはうまくいきません。最終的に機能するのは
- set_fact:
example_dict: "{'{{ some var }}':'{{ some other var }}'}"
最終的には明らかです。ハッシュとして解釈される文字列(外側の二重引用符)を作成します。ハッシュでは、キーと値は単一引用符である必要があります(変数置換の内側の単一引用符)。そして最後に、他の文字列と同様に変数を置き換えます。
ステファン
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
- set_fact: '{{ some_var }}={{ some_value }}'
some_var
(ファクト名)、セパレーター=
の値、およびsome_value
(ファクト値)の値を連結することにより、 インラインモジュールパラメーター式 の文字列を作成します。
- 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 }}"