高级剧本语法
本页面的高级 YAML 语法示例为您提供了更多控制权,可以控制放置在 Ansible 使用的 YAML 文件中的数据。有关 Python 特定 YAML 的更多信息,请参阅官方的 PyYAML 文档.
不安全或原始字符串
在处理查找插件返回的值时,Ansible 使用一种称为 unsafe
的数据类型来阻止模板化。将数据标记为不安全可以防止恶意用户滥用 Jinja2 模板在目标机器上执行任意代码。Ansible 实现确保永远不会对不安全值进行模板化。它比使用 {% raw %} ... {% endraw %}
标记转义 Jinja2 更全面。
您可以在定义的变量中使用相同的数据类型 unsafe
,以防止模板化错误和信息泄露。您可以将由 vars_prompts 提供的值标记为不安全。您也可以在剧本中使用 unsafe
。最常见的用例包括允许特殊字符(如 {
或 %
)的密码以及看起来像模板但不应进行模板化的 JSON 参数。例如
---
mypassword: !unsafe 234%234{435lkj{{lkjsdf
在剧本中
---
hosts: all
vars:
my_unsafe_variable: !unsafe 'unsafe % value'
tasks:
...
对于诸如哈希或数组之类的复杂变量,请在各个元素上使用 !unsafe
---
my_unsafe_array:
- !unsafe 'unsafe element'
- 'safe element'
my_unsafe_hash:
unsafe_key: !unsafe 'unsafe value'
YAML 锚点和别名:共享变量值
YAML 锚点和别名 可帮助您定义、维护和灵活使用共享的变量值。您使用 &
定义锚点,然后使用别名(用 *
表示)引用它。以下是一个使用锚点设置三个值的示例,使用别名使用其中两个值,并覆盖第三个值
---
...
vars:
app1:
jvm: &jvm_opts
opts: '-Xms1G -Xmx2G'
port: 1000
path: /usr/lib/app1
app2:
jvm:
<<: *jvm_opts
path: /usr/lib/app2
...
在这里,app1
和 app2
使用锚点 &jvm_opts
和别名 *jvm_opts
共享 opts
和 port
的值。path
的值由 <<
或 合并运算符 合并。
锚点和别名还允许您共享复杂的变量值集,包括嵌套变量。如果您有一个包含另一个变量值的变量值,则可以分别定义它们
vars:
webapp_version: 1.0
webapp_custom_name: ToDo_App-1.0
这效率低下,而且在规模上意味着更多维护。要将版本值合并到名称中,您可以在 app_version
中使用锚点,并在 custom_name
中使用别名
vars:
webapp:
version: &my_version 1.0
custom_name:
- "ToDo_App"
- *my_version
现在,您可以在 custom_name
的值中重用 app_version
的值,并在模板中使用输出
---
- name: Using values nested inside dictionary
hosts: localhost
vars:
webapp:
version: &my_version 1.0
custom_name:
- "ToDo_App"
- *my_version
tasks:
- name: Using Anchor value
ansible.builtin.debug:
msg: My app is called "{{ webapp.custom_name | join('-') }}".
您已使用 &my_version
锚点锚定 version
的值,并使用 *my_version
别名重用它。锚点和别名允许您访问字典内部的嵌套值。