连接变量字符串的正确方法

Tim*_*bov 35 ansible ansible-playbook

我需要从其他变量的内容创建新变量.目前我正在使用这样的东西:

- command: echo "{{ var1 }}-{{ var2 }}-{{ var3 }}"
  register: newvar
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 用法{{ var1 }}...{{ varN }}带来太长的字符串和非常难看的代码.
  • 使用{{ newvar.stdout }}有点好但令人困惑.
  • set_fact模块的使用在运行之间缓存事实.这对我来说不合适.

还有其他解决方案吗?

udo*_*dan 29

好问题.但我认为没有符合您标准的好答案.我能想到的最好的是使用额外的vars文件.

像这样的任务:

- include_vars: concat.yml
Run Code Online (Sandbox Code Playgroud)

concat.yml你有你的定义:

newvar: "{{ var1 }}-{{ var2 }}-{{ var3 }}"
Run Code Online (Sandbox Code Playgroud)


use*_*557 21

由于字符串是Python中的字符列表,我们可以像连接列表(使用+符号)一样连接字符串:

{{ var1 + '-' + var2 + '-' + var3 }}
Run Code Online (Sandbox Code Playgroud)

如果要将结果字符串传递给某个过滤器,请确保将这些位括在括号中:

例如,要连接我们的3个变量,并获得sha512哈希:

{{ (var1 + var2 + var3) | hash('sha512') }}
Run Code Online (Sandbox Code Playgroud)

注意:这适用于Ansible 2.3.我没有在早期版本上测试它.

  • 虽然正确,但 Jinja 中用于连接字符串的更安全的运算符实际上是 [波浪号 (`~`)](https://jinja.palletsprojects.com/en/3.0.x/templates/#other-operators) 运算符。 (5认同)

小智 11

就像在python本身中加入列表一样简单。

ansible -m debug -a msg="{{ '-'.join(('list', 'joined', 'together')) }}" localhost
Run Code Online (Sandbox Code Playgroud)
localhost | SUCCESS => {
  "msg": "list-joined-together" }
Run Code Online (Sandbox Code Playgroud)

使用变量的工作方式相同:

ansible -m debug -a msg="{{ '-'.join((var1, var2, var3)) }}" localhost
Run Code Online (Sandbox Code Playgroud)