ansible - jinja/ansible 模板中的复杂字符串连接

标签 ansible jinja2 template-engine

我有一个看起来像这样的 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 上找不到很多文档,但还有更多我可以做的吗?还是滑入过滤器的更好选择?

最佳答案

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

- 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 %}

关于ansible - jinja/ansible 模板中的复杂字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698232/

相关文章:

exit - 是否可以退出 Freemarker 模板?

macos - 与dbt。如何在 yaml 文件中使用 jinja 宏

macos - 出现 "ImportError: No Module named yaml"错误

linux - 无法使用 Ansible 更新 sshd 配置文件

regex - Ansible 正则表达式从/etc/hosts 中删除匹配的 IP

templates - 使用 Django 模板标签的 Jinja2 模板

python - 如何使用原始 SQL 查询实现搜索功能

github - 如何在Jekyll's Liquid模板中比较字符串大小/长度?

ruby-on-rails-3 - 在液体标签调用中使用液体变量

Ansible 被困在某些处于错误 ps 状态的服务器上?