次のスクリプトがあります~ # cat demo.yml
。
- name: demo
hosts: localhost
gather_facts: no
vars:
set:
task:
type: var1
task:
- type: var1
- type: var2
- type: var3
tasks:
- debug:
var: set
- debug:
var: task
- set_fact:
task:
type: "{{set.task.type if item.type is search(set.task.type|join('|')) else 'absent'}}"
loop: "{{task}}"
- debug:
var: task
出力:
PLAY [demo] ************************************************************************************************************************************************************************************************
TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
"set": {
"task": {
"type": "var1"
}
}
}
TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
"task": [
{
"type": "var1"
},
{
"type": "var2"
},
{
"type": "var3"
}
]
}
TASK [set_fact] ********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'type': 'var1'})
ok: [localhost] => (item={'type': 'var2'})
ok: [localhost] => (item={'type': 'var3'})
TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
"task": {
"type": "var1"
}
}
PLAY RECAP *************************************************************************************************************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ご覧のとおり、これは変数に対してうまく機能し、新しい値がtask.type
次のように設定されています。変数1。
しかし、問題は私が提供したり、set.task.type: var4
他の変数を提供したときです。
比率task.type
は次のように設定されます。変数4変える欠席。
質問:
task.type: absent
set.task.type
配列の値と一致しない場合は、新しい値をどのように設定しますか?
答え1
あなたが達成したいことが何であるかも私には明確ではありませんが、あなたの質問について
task.type: absent
set.task.type
配列の値と一致しない場合は、新しい値をどのように設定しますか?
そして
set.task.type
存在しない値task.type
の配列を提供するまでは大丈夫でした。(注:リスト)
| join('|')
これは辞書のフィルタによるもののようで、loop
私にはそれが不要に見える。だからどのように
変数が
set.task.type
リストにあることを確認してくださいtask.type
。値が存在する場合は、task.type
その値で更新する必要がありますset.task.type
。
ループ実行なし
---
- hosts: localhost
become: false
gather_facts: false
vars:
# dictionary
set:
task:
type: var4
# list
task:
- type: var1
- type: var2
- type: var3
tasks:
- debug:
msg: "{{ set.task.type if task | join('|') is search(set.task.type) else 'absent' }}"
これにより結果のみが出力されます。
TASK [debug] *****
ok: [localhost] =>
msg: absent
参考にしてください。新しい値を設定しない代わりに新しいオブジェクトが作成されます。それ以降はリストがなく、辞書しかありませtask[*].type
んtask.type
。
追加文書
update_fact
モジュール - 現在のファクトセットを更新します。変数はその場で変更されませんが、モジュールから返されます。