我正在尝试使用Regex将Web.config文件中的标记值替换为Ansible Playbook。
这是我的示例文件。
TXWebSocketHandler="Data =localhost;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Catalog Name=catalogname;User =user;key=key;
我期望的输出应为
TXWebSocketHandler="Data =127.0.0.1;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =127.0.0.1;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =127.0.0.1;Catalog Name=catalogname;User =user;key=key;
所有本地主机都应替换为127.0.0.1。
我使用的战术手册是
- name: replace_config
community.windows.win_lineinfile:
path: 'D:\Apps\project\web.config'
regexp: /localhost/g
line: 127.0.0.1
为此,我将得到如下输出:
TXWebSocketHandler="Data =localhost;Socket Name=Socketname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Socket Name=Socketname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Socket Name=Socketname;User =user;key=key;
127.0.0.1
我添加的替换值在localhost中没有被替换,但它被添加到文件的末尾。当我尝试使用任何regex generator时,它都能像我希望的那样正常工作。
这是正则表达式的问题还是我在这个ansible剧本中遗漏了任何参数?请建议一些方法来用另一个单词替换所有出现的单词。
1条答案
按热度按时间xytpbqjk1#
单行限制
模块 community.windows.win_lineinfile 似乎只能在单行上工作:
确保特定行位于文件中,或使用反向引用的正则表达式替换现有行
摘自概要:
当您只想更改文件中的一行时,这一点非常有用。
你仍然可以使用
backrefs: true
来替换一行,参见文档(限制用粗体强调):如果
regexp
匹配,则最后一个匹配行将被扩展行参数替换。另请参见Ansible lineinfile module syntax error when using multiple variables in string。
在您的行动手册中:
这应该会将匹配的
localhost
替换为回送IP127.0.0.1
,并将之前(由$1反向引用)和之后(由$2反向引用)捕获的部分设置回。注:如果有效,请尝试删除IP地址周围的空格。
替换为内置模块
正如塞沙德里克所建议的:ansible.builtin.replace模块可用于:
使用反向引用正则表达式替换文件中特定字符串的所有示例
参见概要:
此模块将替换文件中图案的所有示例。
从文档中,根据您的用例修改第一个示例“用新主机名替换旧主机名”:
注意:我将反斜杠(Windows路径分隔符)替换为正斜杠(Python中更安全)。在back-ref
\1
之后和\2
之前添加的空格可能会被删除(不确定是否有效,因为back-ref和IP-address的编号可能会冲突)。另一种方法请参见文档“Explicitly specified named matched groups”中的另一个示例。