ansible - 如何在 Ansible 中创建/加入变量
问题描述
我需要为配置文件创建一个字符串。
它需要采用以下格式:
nodes = ["node1","node2","node3"]
我最初试图通过从主机中的特定组读取主机来做到这一点,但我决定使用 vars 文件会更好。
在我的 vars 文件中
---
nodes:
- node: node1
- node: node2
- node: node3
然后我想使用 lineinfile 函数来更新配置:
- name: Update cluster nodes
lineinfile:
path: /etc/nodes.txt
regexp: '^#nodes:'
line: "nodes: ["node1","node2","node3"]"
任何人都可以帮助我,因为我真的很难在遍历节点列表后创建字符串。
解决方案
您想利用 jinja2 的“空白控制”功能,方法是在模板前导和尾随,{%-
并-%}
确保为剧本阅读器的易读性而存在的任何空白都不会传递到行中。然后,您可能会发现将行组合移动到本地vars:
只是为了便于阅读:
- name: Update cluster nodes
lineinfile:
# ...as before
line: 'nodes: [{{ nodes_csv }}]'
vars:
nodes_csv: >-
{%- for n in nodes -%}
{{ "" if loop.first else "," }}"{{ n }}"
{%- endfor -%}
根据您的特定需求,您可能还只想使用to_json
过滤器,然后告诉它使用不带空格的分隔符,因为您的示例看起来非常像 JSON:
lineinfile:
line: 'nodes: {{ nodes | to_json(separators=(",", ":")) }}'
推荐阅读
- python - 我的函数缺少 1 个必需的位置参数:“请求”
- python - 用python列出所有ESXI的vm
- c++ - 如何为 c++ PBDS 制作自定义计算函数?
- java - Spring KafkaListener with topicPattern,分配所有主题的所有分区
- android - 如何在通知中播放有时声音
- docker - 在docker中运行命令时出现“没有这样的文件或目录/”错误
- php - symfony 5.1:如何将控制器定义为服务
- javascript - 将一个表情符号选择器中的表情符号插入两个不同的文本区域
- pandas - 计算熊猫中具有特定值的列数
- postgresql - 无法使用输入参数在函数中执行查询?