簡體   English   中英

Ansible 使用動態鍵/值設置事實

[英]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 }}" 這返回了相同的結果。

我希望能夠在未來的角色中通過從命令返回的變量名進行調用。 有任何想法嗎?

關於您可能感興趣的代碼片段的兩點:

  • 您的命令中已經有 output 的換行符版本,它是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM