gpt4 book ai didi

Ansible with_dict 模板使用

转载 作者:行者123 更新时间:2023-12-04 14:58:09 25 4
gpt4 key购买 nike

我有以下任务:

- name: copy server.xml
template: src=server.xml dest=/var/containers/{{ item.key }}/conf
with_dict: containers

而且我还在我的 group_vars 中添加了容器字典
containers:
frontend:
http_port: 8080
backend:
http_port: 8081

最后这里是来自 server.xml 的相关片段
<Connector port="{{ http_port }}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

我想要发生的是相关的 http_port 在模板模块中使用。但相反,我得到了错误:

致命:[localhost] => {'msg':“AnsibleUndefinedVariable:一个或多个 undefined variable :'http_port'未定义”,'失败':True}

这可能吗?如何利用项目的值进行变量替换?

最佳答案

使用 {{ item.value.http_port }}是完全正确的解决方案。

当您传递 with_dict 时,它会循环通过将容器字典中的每个项目作为 {{ item }} 传递的任务。 ,其中项目有一个键和字典项目包含的任何值 - 在你的情况下,键/值对,其中键是 http_port 并且值是这两个不同的整数 - 但是你可以传递非常复杂的嵌套字典,它会得到更多使用 {{ item.value.http_port }} 访问内容很重要你想出的语法。

当您使用更复杂的模板时要警惕的是,当您有一些额外的变量要为一个主机(或容器或其他)模板而不是另一个主机时,如何混合并设置默认值并使用 if 语句。

要掌握它,请阅读 Jinja2,Ansible 解释模板的语言。一个很好的例子是在前端通过 SSL 提供文件,而不是后端。使用类似 {{ foo | default('bar') }} 的语法避免 Ansible 因您尝试使用 undefined variable 和 if 语句而生气,以确保您只是在模板化您需要的东西。

一个粗略的草图 - 假设你有:

containers:
frontend:
http_port: 8080
https_port: 8443
ssl_cert: ./files/keystore
ssl_pass: "{{ vaulted_vars.ssl_pass }}"
backend:
http_port: 8081

在这种情况下,假设您有一项任务在需要时将该 keystore 复制到文件系统上,您可以使用以下内容:
<Connector port="{{ item.value.http_port }}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="{{ item.value.https_port | default('8443')" />
{% if item.value.ssl_cert is defined %}
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore" keystorePass="{{ item.value.ssl_pass }}"
clientAuth="false" sslProtocol="TLS"/>
{% endif %}

快乐的模板!

关于Ansible with_dict 模板使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26020465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com