18

lineinfile模块中,它替换了整行。

如果这条线很长,我必须再次重复整条线。

假设我想替换文件中的单个单词:

#abc.conf
This is my horse

这是剧本:

 - lineinfile: dest=abc.conf
               state=present
               regexp='horse'
               line='This is my dog'
               backup=yes

有什么办法可以达到类似的效果sed 's/horse/dog/g'吗?

4

3 回答 3

30

自版本以来可用的新模块替换1.6

- replace:
    dest=abc.conf
    regexp='horse'
    replace='dog'
    backup=yes
于 2014-09-11T14:21:06.210 回答
19

您可以使用反向引用来检索该行的其他部分(不应更改):

 - lineinfile: dest=abc.conf
               state=present
               regexp='^(.*)horse(.*)$'
               line='\1dog\2'
               backup=yes
               backrefs=yes
于 2014-03-14T13:10:01.700 回答
2

如果您需要在一个块中执行更多替换操作并且您在本地有文件,您可能需要考虑使用模板,它替换模板文件中的变量并将文件复制到远程:

- template: src=/mytemplates/foo.j2 dest=/etc/file.conf

在本地文件中,您可以使用 ansible sintax 编写一个变量,例如

{{variable}}

如果它在脚本的范围内,它将被替换。这里是文档。

于 2015-08-26T13:26:34.067 回答