首页 > 解决方案 > 在配置中替换一行的 Ansible 方法

问题描述

我有一个json如下:

{
    "bootstrap": true,
    "server": true,
    "datacenter": "aws",
    "data_dir": "/var/consul",
    "log_level": "INFO",
    "enable_syslog": true
}

这是在ansible库存文件中的3台服务器上

[consul]
10.0.0.1
10.0.0.2
10.0.0.3

现在要使节点加入集群,我还必须实际添加以下配置行

"start_join": ["ip_of_other_node_1", "ip_of_other_node_2"] 

这将在 3 台服务器上进行

所以基本上这意味着如果10.0.0.1是集群中的那些节点之一,它的配置看起来像

{
    "bootstrap": true,
    "server": true,
    "datacenter": "aws",
    "data_dir": "/var/consul",
    "log_level": "INFO",
    "enable_syslog": true,
    "start_join": ["10.0.0.2","10.0.0.3"]
}

我正在尝试通过 ansible 进行如下操作:

  - name: Add the ip's of other servers to join cluster
    lineinfile:
        path: /etc/consul.d/server/config.json
        regexp: '^"enable_syslog"'
        insertafter: '^"enable_syslog"'
        line: '"start_join": ["{{ groups['consul'][1] }}", "{{ groups['consul'][2] }}"]'
    when: inventory_hostname == '{{ groups['consul'][0] }}'

这并没有真正帮助我说出语法错误:,我不确定通过 ansible 实现这样的事情的最佳方法是什么,以及当我增加库存服务器时如何解决这种情况。

标签: ansibleansible-2.xansible-inventory

解决方案


您可以使用模板模块替换服务器上的配置文件,而不是使用正则表达式更改它。这样,您可以使用常规模板添加任务以生成新的配置文件,其中start_join包含主机文件(或任何其他更复杂的配置)元素的字段。jinja2


推荐阅读