Ansible:如果满足某个条件,则有条件地在 vars 文件中定义变量

pan*_*ohn 30 automation ansible jinja

根据定义到 group_vars 中的变量的值(真/假),我试图在 vars 文件中定义一些变量。它们的值取决于组变量的值。

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

{% if my_group_var %}
test:
   var1: value
   var2: value
   ...
   varn: value
{% else %}
test:
   var1: other_value
   var2: other_value
   ...
   varn: other_value
{% endif %}
Run Code Online (Sandbox Code Playgroud)

对于我的每一个角色,我都使用了一个定义在这个文件中的变量。

我的测试手册如下所示:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/test_vars.yml
  roles: blabla 
Run Code Online (Sandbox Code Playgroud)

运行剧本后我收到的错误是:

{% 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>"
Run Code Online (Sandbox Code Playgroud)

我在这里做一些愚蠢的事情还是什至不支持?我试图找到另一种定义这些变量的方法(我有很多),但我没有设法在这里得到一些功能。有什么建议?

Vla*_*mir 21

Ansible 允许以下形式之一有条件地定义变量:

    test:
      var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
      var2: "{{'value' if (my_group_var) else 'other_value'}}"
Run Code Online (Sandbox Code Playgroud)

将上述语法与 vars 查找相结合,我们可以加载复杂的 vars(在本例中为列表):

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')}}"
Run Code Online (Sandbox Code Playgroud)

还有另一种使用 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) }}"
Run Code Online (Sandbox Code Playgroud)


HBr*_*ijn 15

我不认为你可以,我通常创建单独的文件来保存条件变量集合并使用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" 
Run Code Online (Sandbox Code Playgroud)

  • 这是我试图避免的事情。我不想使用包含变量或为我的任务定义 2 个额外的 var 文件。 (3认同)

pan*_*ohn 0

我最终所做的是创建 2 个单独的 var 文件 - 让我们称它们为type_a.ymltype_b.yml- 我定义了一个组变量来指示要使用的文件 - 类似type_of_file: a. 这就是我的剧本现在的样子:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/type_{{ type_of_file }}.yml
  roles: blabla
Run Code Online (Sandbox Code Playgroud)

感谢所有的答案。我发现它们真的很有帮助。