Ansible

Ansible:如果滿足某個條件,則有條件地在 vars 文件中定義變數

  • February 12, 2022

根據定義到 group_vars 中的變數的值(True/False),我試圖在 vars 文件中定義一些變數。它們的值取決於組 var 的值。

我目前的 var 文件如下所示:

{% if my_group_var %}
test:
  var1: value
  var2: value
  ...
  varn: value
{% else %}
test:
  var1: other_value
  var2: other_value
  ...
  varn: other_value
{% endif %}

對於我的每個角色,我都在使用一個定義在這個文件中的變數。

我的測試劇本如下所示:

- name: blabla
 hosts: blabla
 vars_files:
    - <path>/test_vars.yml
 roles: blabla 

執行劇本後我收到的錯誤是:

{% if my_group_var %}
^ here

exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
 in "<unicode string>"

我在這裡做一些愚蠢的事情還是甚至不支持?我試圖找到另一種定義這些變數的方法(我有很多),但我沒有設法在這裡獲得一些功能。有什麼建議麼?

Ansible 允許以下形式之一有條件地定義變數:

   test:
     var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
     var2: "{{'value' if (my_group_var) else 'other_value'}}"

將上述語法與 vars 查找相結合,我們可以載入複雜的 vars(在本例中為 map):

test_value_when_my_group_var_is_true:
  var1: value
  var2: value

test_value_when_my_group_var_is_false:
  var1: other_value
  var2: other_value

test: "{{ lookup('vars','test_value_when_my_group_var_is_true') if (my_group_var) else lookup('vars','test_value_when_my_group_var_is_false')}}"

還有另一種使用 vars 查找進行條件樹載入的方法。當您需要實現案例邏輯時,這種方式很方便(即條件變數有兩個以上的可能值):

test_value_when_my_group_var_is_foo:
  var1: value
  var2: value

test_value_when_my_group_var_is_bar:
  var1: other_value
  var2: other_value

test_value_when_my_group_var_is_baz:
  var1: yet_another_value
  var2: yet_another_value

test: "{{ lookup('vars','test_value_when_my_group_var_is_' + my_group_var) }}"

我不認為你可以,我通常創建單獨的文件來保存條件變數集合併使用when子句將它們包含在特定條件下:

- include_vars: test_environment_vars.yml
 when: global_platform == "test"

- include_vars: staging_environment_vars.yml
 when: global_platform == "staging"

- include_vars: prod_environment_vars.yml
 when: 
   - global_platform != "test" 
   - global_platform != "staging" 

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