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 文件 - 让我们称它们为type_a.yml
和type_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)
感谢所有的答案。我发现它们真的很有帮助。