【问题标题】:Proper way to concatenate variable strings连接变量字符串的正确方法
【发布时间】:2015-07-02 14:09:31
【问题描述】:

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

- command: echo "{{ var1 }}-{{ var2 }}-{{ var3 }}"
  register: newvar

问题是:

  • 使用{{ var1 }}...{{ varN }} 会带来太长的字符串和非常丑陋的代码。
  • {{ newvar.stdout }} 的用法更好一些,但令人困惑。
  • 在运行之间使用set_fact 模块缓存事实。不适合我。

还有其他解决办法吗?

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

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

    {{ var1 + '-' + var2 + '-' + var3 }}
    

    如果您想将生成的字符串传送到某个过滤器,请确保将位括在括号中:

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

    {{ (var1 + var2 + var3) | hash('sha512') }}
    

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

    【讨论】:

    • 虽然正确,但在 Jinja 中连接字符串更安全的运算符实际上是 the tilde (~) 运算符。
    【解决方案2】:

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

    这样的任务:

    - include_vars: concat.yml
    

    concat.yml 中你有你的定义:

    newvar: "{{ var1 }}-{{ var2 }}-{{ var3 }}"
    

    【讨论】:

      【解决方案3】:

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

      ansible -m debug -a msg="{{ '-'.join(('list', 'joined', 'together')) }}" localhost
      

      localhost | SUCCESS => {
        "msg": "list-joined-together" }
      

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

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

      【讨论】:

      • 顺便说一句。为什么ansible -m debug -a msg="title {{ '-'.join((var1, var2, var3)) }}" localhost 不起作用?
      • @orodbhen 不是 100% 肯定,但感觉像是一些奇怪的 arg 解析问题 - 尝试:ansible -m debug -a "msg='{{ var1 }} title {{ var1 }} {{ \"-\".join((var1, var2, var3)) }}'" localhost -e var1=test -e var2=foo -e var3=bar
      • 有趣的是,这个有效:ansible -m debug -a "msg='{{ var1 }} title {{ var1 }} {{ '-'.join((var1, var2, var3)) }}'" localhost -e var1=test -e var2=foo -e var3=bar
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多