Regex 使用Ansible替换YAML文件中的特定字符串

Regex 使用Ansible替换YAML文件中的特定字符串,regex,ansible,yaml,Regex,Ansible,Yaml,我有一个web应用程序,它使用YAML文件进行配置。这是文件中的一个例外: --- settings: domain: 127.0.0.1 我有一个Ansible playbook,它使用lineinfle模块将上面YAML文件中的IP地址替换为服务器的公共IP地址 - name: Discovering Public Internet Protocol Address ipify_facts: register: public_ip - name: Configuring Ap

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

---
settings:
  domain: 127.0.0.1
我有一个Ansible playbook,它使用lineinfle模块将上面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语法错误


我不介意用另一个模块替换lineinfle,但如果可能的话,我想保留它。我已经为此挣扎了几个小时,非常感谢您的帮助

作为快速解决方案,尝试使用两个空格进行更好的匹配和替换:

    regexp: '^.*domain: (.*)$'
    line: '  domain: {{ ipify_public_ip }}'
我确信可以对正则表达式进行其他改进,使用\s或[:space:]


更新:不需要从regexp的开头添加。*。根据请求的注释进行更新。

作为快速解决方案,尝试使用2个空格进行更好的匹配和替换:

    regexp: '^.*domain: (.*)$'
    line: '  domain: {{ ipify_public_ip }}'
我确信可以对正则表达式进行其他改进,使用\s或[:space:]


更新:不需要从regexp的开头添加。*。根据请求的评论进行更新。

您只需创建一个yaml模板验证

- template:
    src: /path/to/settings.tpl.yml
    dest: /path/to/settings.yml
settings.tpl.yml


您可以创建一个yaml模板验证

- template:
    src: /path/to/settings.tpl.yml
    dest: /path/to/settings.yml
settings.tpl.yml


谢谢你的回复。我根据你的指示用2个空格更新了剧本,但没用。这一次,该行保持不变。如果您是正则表达式“^domain:.*$”与您的文件匹配,它应该可以工作。您可能手动并通过ansible修改了该文件。在我第一次尝试时,我注意到它在底部添加了额外的域:$ip线。我清理了文件,按照您最初的指示退出,它完美地修改了它。我对你感激不尽。祝你有美好的一天!谢谢你的回复。我根据你的指示用2个空格更新了剧本,但没用。这一次,该行保持不变。如果您是正则表达式“^domain:.*$”与您的文件匹配,它应该可以工作。您可能手动并通过ansible修改了该文件。在我第一次尝试时,我注意到它在底部添加了额外的域:$ip线。我清理了文件,按照您最初的指示退出,它完美地修改了它。我对你感激不尽。祝你有美好的一天!