在 Ansible yaml 模板中呈现数字

Render numbers inside an Ansible yaml template

提问人:samb 提问时间:11/14/2023 更新时间:11/15/2023 访问量:42

问:

非常接近使用 Ansible 的三元运算符创建一个 int var,该答案 https://stackoverflow.com/a/69109779/446302

在 Ansible 项目中,我尝试使用一个包含整数内容的 yaml 模板文件,如下所示:

---
my_service:
  enable_ipv6: false
  node_listen:
    - port: '{{ http_port | int }}'
      ip: '{{ srv_ip }}'

不幸的是,它呈现为:

---
my_service:
  enable_ipv6: false
  node_listen:
    - port: '8080'
      ip: '192.0.0.2'

我使用的应用程序对端口类型非常严格,这意味着除非我能给它一个 int 端口号,否则它会崩溃。

由于其他子设置的循环,我怎么能知道我需要将其保留在模板文件中?

ansible 铸造 jinja2 ansible 模板

评论


答:

2赞 U880D 11/14/2023 #1

对于 Jinja2 模板文件 service.yml.j2 作为输入

---
my_service:
  enable_ipv6: false
  node_listen:
    - port: {{ HTTP_PORT }}
      ip: '{{ SRV_IP }}'

通过最小示例 playbook main.yml 进行处理

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    HTTP_PORT: 8080
    SRV_IP: 127.0.0.1

  tasks:

  - template:
      src: service.yml.j2  #  input file
      dest: service.yml    # output file

将生成一个输出文件 service.yml,其内容为

---
my_service:
  enable_ipv6: false
  node_listen:
    - port: 8080
      ip: '127.0.0.1'

评论

0赞 samb 11/14/2023
啊......我在 Jinja2 文件中混合了 Ansible 的 yml 语法和 yml。咔嚓咔嚓!
1赞 Vladimir Botka 11/14/2023 #2

给定模板

shell> cat my_service.yml
---
my_service:
  enable_ipv6: false
  node_listen:
    port: {{ http_port }}
    ip: {{ srv_ip }}

和变量

  http_port: 8080
  srv_ip: 192.0.0.2

使用模板查找插件读取它

  data: "{{ lookup('template', 'my_service.yml')|from_yaml }}"

  data:
    my_service:
      enable_ipv6: false
      node_listen:
        ip: 192.0.0.2
        port: 8080
  data.my_service.node_listen.port|type_debug: int

请参阅使用变量时返回不带引号的整数值


用于测试的完整 playbook 示例

- hosts: all

  vars:

    http_port: 8080
    srv_ip: 192.0.0.2
    data: "{{ lookup('template', 'my_service.yml')|from_yaml }}"

  tasks:

    - debug:
        var: data

    - debug:
        var: data.my_service.node_listen.port

    - debug:
        var: data.my_service.node_listen.port|type_debug