Ansible

在“命令”任務中動態傳遞 json 作為參數

  • October 4, 2021

我的劇本中有這個任務:

- 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

引用自:https://serverfault.com/questions/1079481