[英]Ansible Setting fact with dynamic key/value
我正在嘗試從我從另一個角色調用的命令任務的標准輸出中設置 ansible 事實。
角色A:
- name: example command
command: client get -s {{ service }}
register: vars_string
- name: set vars
set_fact: vars={{ vars_string.stdout.split('\n')}}
when:
- vars_string.stdout | length > 0
- name: set vars as facts
set_fact: "{{ item }}"
with_items: "{{ vars }}"
變量 output:
"vars": [
"tst=ansible",
"example=values"
]
角色 B:
- debug:
var: tst
角色 B 的結果:
期望: { "tst": "ansible" }
現實: { "tst": "VARIABLE IS NOT DEFINED!" }
{ "tst": "VARIABLE IS NOT DEFINED!" }
我曾嘗試將 vars 吐入 dict 並使用set_fact: "{{ item.key }}": "{{ item.value }}"
。 這返回了相同的結果。
我希望能夠在未來的角色中通過從命令返回的變量名進行調用。 有任何想法嗎?
關於您可能感興趣的代碼片段的兩點:
vars_string.stdout_lines
vars
內置變量,但無論哪種方式,都不要這樣做據我所知,沒有支持的語法用於從任務中分配任意頂級主機事實。
您有兩個選擇:將這些變量寫到文件中,然后使用include_vars:
將它們讀入 - 這會將它們分配為主機事實,或者讓步set_fact:
想要的方式並滿足於生活在下面的動態變量hostfacts 中的已知鍵
我們將首先展示后者,因為它更短:
- set_fact:
my_facts: >-
{{ "{" + (vars_string.stdout_lines
| map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
| join(",")) + "}"
}}
when:
- vars_string.stdout | length > 0
當然,請注意,如果您的鍵或值中包含非 JSON 友好字符,則詭計將不起作用,但如果該簡單版本不起作用,請提出后續問題,因為在同一條靜脈
include_vars:
方式是:
- tempfile:
state: file
suffix: .json
register: vars_filename
- copy:
dest: '{{ vars_filename.path }}'
content: >-
{{ "{" + (vars_string.stdout_lines
| map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
| join(",")) + "}"
}}
- include_vars:
file: '{{ vars_filename.path }}'
- file:
path: '{{ vars_filename.path }}'
state: absent
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.