首页 > 解决方案 > 使用 Ansible 替换 YAML 文件中的特定字符串

问题描述

我有一个使用 YAML 文件进行配置的 Web 应用程序。这是文件中的一个例外:

---
settings:
  domain: 127.0.0.1

我有一个 Ansible 剧本,它使用 lineinfile 模块将上面 YAML 文件中的 IP 地址替换为服务器的公共 IP 地址。

- name: Discovering Public Internet Protocol Address
  ipify_facts:
  register: public_ip

- name: Configuring Application with discovered Public IP
  lineinfile:
    dest: /application/path/settings.yml
    regexp: '^(.*)domain: (.*)$'
    line: 'domain: {{ ipify_public_ip }}'

这会找到 127.0.0.1 IP 并将其替换为公共服务器的 IP,但它会破坏 YAML 缩进,如下所示:

---
settings:
domain: 54.12.33.3

问题:“域”与“设置”移动到同一行,我的 ruby​​ 应用程序无法运行迁移,因为它识别出 YAML 语法错误。

我不介意用另一个模块替换 lineinfile,但如果可能的话,我想保留它。我已经为此苦苦挣扎了几个小时,并将感谢任何帮助。

标签: regexansibleyaml

解决方案


作为一个快速的解决方案,尝试使用 2 个空格 ( ) 以获得更好的匹配和替换:

    regexp: '^.*domain: (.*)$'
    line: '  domain: {{ ipify_public_ip }}'

我确信可以对正则表达式进行其他改进,以使用\sor [:space:]

更新: .*从一开始regexp就不需要。根据请求的评论更新。


推荐阅读