Ansible
在“命令”任務中動態傳遞 json 作為參數
我的劇本中有這個任務:
- name: Update instance tags command: oci compute instance update -c {{ compartment }} --freeform-tags {{ tag_var_json }}
根據該命令的oracle 文件,該參數
--freeform-tags
接受一個表示標籤鍵值對的 json。我需要在劇本本身中動態創建這個 json,所以在執行該任務之前,我有一個用於測試目的:- name: Create a json object to use as tag set_fact: tag_var: '{ "test": "thisisatest" }' set_fact: tag_var_json: "{{ tag_var | to_json }}"
但我一定是做錯了什麼,因為我不斷收到這個錯誤:
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'tag_var' is undefined
有沒有更簡單的方法可以直接在劇本中創建 json 並將其作為參數傳遞給該參數?
謝謝你。
這裡有兩件事。首先是您創建了解析器接受的 YAML,但其行為方式有點出乎意料(並且會在目前版本的 Ansible 中產生警告。)
- name: Create a json object to use as tag set_fact: tag_var: '{ "test": "thisisatest" }' set_fact: tag_var_json: "{{ tag_var | to_json }}"
YAML 中的鍵是唯一的;當解析器遇到相同鍵的第二個實例時,它會丟棄第一個。由於您重複
set_fact
了 ,這相當於:- name: Create a json object to use as tag set_fact: tag_var_json: "{{ tag_var | to_json }}"
但是,更正語法錯誤仍會導致失敗。
- name: Create a json object to use as tag set_fact: tag_var: '{ "test": "thisisatest" }' tag_var_json: "{{ tag_var | to_json }}"
在任務執行之前必須對參數
set_fact
進行模板化,此時 tag_var 仍未定義(因為此任務正在定義它。)編寫此任務的一種正確方法是作為兩個單獨的任務:
- name: Create a tag object set_fact: tag_var: test: thisisatest - name: Create a JSON string for tagging set_fact: tag_var_json: "{{ tag_var | to_json }}"
但是,
set_fact
根本不需要。您可以直接在使用它的任務上設置 var,這樣既更有效,又使其範圍更窄。- name: Update instance tags command: oci compute instance update -c {{ compartment }} --freeform-tags "{{ tag_var | to_json }}" vars: tag_var: test: thisisatest