首页 > 解决方案 > 如何在 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"]"

任何人都可以帮助我,因为我真的很难在遍历节点列表后创建字符串。

标签: ansible

解决方案


您想利用 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=(",", ":")) }}'

推荐阅读