【问题标题】:Complex string concatenation in jinja/ansible templatejinja/ansible 模板中的复杂字符串连接
【发布时间】:2017-07-30 14:36:31
【问题描述】:

我有一个看起来像这样的 ansible dict:

servers:
  - name: foo
    port: 1000
  - name: bar
    port: 2000

我想要一个 ansible/jinja2 模板来输出:

result=pre-foo-1000,pre-bar-1000

到目前为止,我得到了类似的东西:

result={{ servers | json_query('[*].name') | join(',') }}

但这只是输出:

result=foo,bar

我尝试过类似json_query('[*].name-[*].port') 之类的方法,但没有成功——它给出了关于无效- 文字的错误。我在 json_query 上找不到很多文档,但我可以在那里做更多的事情吗?还是滑入过滤器的更好选择?

【问题讨论】:

    标签: ansible jinja2 template-engine


    【解决方案1】:

    你可以先做一个简单的循环,然后收集结果:

    - hosts: all
      connection: local
      vars:
        servers:
          - name: foo
            port: 1000
          - name: bar
            port: 2000
      tasks:
        - set_fact:
            result_item: '{{ item.name }}-{{ item.port }}'
          with_items:
            - '{{ servers }}'
          register: result_list
    
        - set_fact:
            result: '{{ result_list.results | map(attribute="ansible_facts.result_item") | join(",") }}'
    
        - debug:
            var: result
    

    或者尝试一些内联 jinja 循环:

    - hosts: all
      connection: local
      vars:
        servers:
          - name: foo
            port: 1000
          - name: bar
            port: 2000
      tasks:
        - set_fact:
            result: "{% for item in servers %}{{item.name}}-{{item.port}}{{ '' if loop.last else ',' }}{% endfor %}"
    
        - debug:
            var: result
    

    这也应该在模板文件中起作用:

    result={% for item in servers %}{{item.name}}-{{item.port}}{{ '' if loop.last else ',' }}{% endfor %}
    

    【讨论】:

    • 我在模板文件中执行此操作。这有什么改变吗?还是我应该先在任务文件中执行这些任务然后运行模板?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多