set_fact: 変数に値をセットする †
文字列にキャストして連結 †
dict型の中のlist型に追加する †
- set_factは新しく変数を作るイメージ
- 例: dict1.versions + dict2.versions
- playbook.yml
- hosts:
- localhost
become: false
gather_facts: false
connection: local
vars:
- dict1:
name: "dict1"
versions:
- version: "1.0"
providers:
- name: prov1
- dict2:
name: "dict2"
versions:
- version: "2.0"
providers:
- name: prov2
tasks:
- set_fact:
dict3: >
{{
dict1
| combine(
{
'versions': dict1.versions + dict2.versions
}
, recursive=True
)
}}
- debug: var=dict3
- 実行結果
ansible-playbook playbook.yml
...
TASK [debug] ****************************************************************************************************************
ok: [localhost] => {
"dict3": {
"name": "dict1",
"versions": [
{
"providers": [
{
"name": "prov1"
}
],
"version": "1.0"
},
{
"providers": [
{
"name": "prov2"
}
],
"version": "2.0"
}
]
}
}
...
外部コマンドを連続実行して、内部変数に取り込む †
- 目的
- 外部コマンドに PARAM1, PARAM2 を渡して実行し、結果を内部変数の var1, var2 に入れたい。
- 実行
ansible-playbook playbook.local.yml
...
TASK [debug] **************************************************************************************************************************************************
ok: [localhost] => {
"msg": [
"var1: PARAM1 result",
"var2: PARAM2 result",
""
]
}
「is undefined」エラー †
- ansible 2.6.4では「set_fact: var1="val1"」とすると、var1を参照する部分でエラーになる。
- 解決:
set_fact:
var1: "val1"
listにdictを複数追加する †
- array1を初期化しておかないとエラーになる。
- 初期化は「array1: "array1 | default([]) | ..."」でもOK。
- 実行結果
ansible-playbook playbook.yml
...
TASK [debug] *******************************************************************
ok: [localhost] => {
"array1": [
{
"key1": "value1",
"key2": "value2"
},
{
"key3": "value3"
}
]
}
複雑なdictから、簡単なdictを生成する †
- hosts:
- localhost
become: False
gather_facts: False
connection: local
vars:
results:
- id: "0001"
name: user01
state: present
- id: "0002"
name: user02
state: absent
- id: "0003"
name: user03
state: present
active_users: []
tasks:
- set_fact:
active_users: "{{ active_users + [ { 'id':item.id, 'name':item.name } ] }}"
when: item.state == 'present'
with_items: "{{ results }}"
- debug:
var: active_users
同じset_fact内で定義した変数の参照でエラー †