replace 模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。replace 模块和 lineinfile、blockinfile 两个模块不同,它并不是 Ansible 的核心模块,而是由社区维护。
1、replace 模块的常用参数
path 参数
:
- 必须指定的参数。
- 和 file 模块的 path 参数一样,指定要操作的文件。
- 别名:dest, destfile, name。
regexp 参数
:
- 必须指定的参数。
- 指定一个Python 的正则表达式,文件中与正则表达式匹配的字符串将会被替换。
- Uses MULTILINE mode, which means ^ and $ match the beginning and end of the file, as well as the beginning and end respectively of each line of the file.
- Does not use DOTALL, which means the . special character matches any character except newlines. A common mistake is to assume that a negated character set like [^#] will also not match newlines.
- In order to exclude newlines, they must be added to the set like [^#\n].
- Note that, as of Ansible 2.0, short form tasks should have any escape sequences backslash-escaped in order to prevent them being parsed as string literal escapes. See the examples.
replace 参数
:
- 替换
regexp
参数指定的正则表达式匹配的字符串,如果没有replace
参数,则删除匹配的所有字符串。 - May contain backreferences that will get expanded with the regexp capture groups if the regexp matches.
- Backreferences can be used ambiguously like \1, or explicitly like \g<1>.
after 参数
:
- 指定一个 Python 的正则表达式,仅该正则表达式之后的内容会被替换或者移除,可以和
before
参数一起使用。 - 如果使用
DOTALL
表示特殊字符.
可以匹配新行。
before 参数
:
- 指定一个 Python 的正则表达式,仅该正则表达式之前的内容会被替换或者移除,可以和
after
参数一起使用。 - 如果使用
DOTALL
表示特殊字符.
可以匹配新行。
encoding 参数
:
- 需要操作的文件的字符编码。
- 默认值
"utf-8"
。
validate 参数
:
- 修改文件之前进行校验。
- 使用“%s”表示
path
参数指定的需要修改的文件。
file
模块的一些参数,常用的有:
backup
:是否在修改文件之前对文件进行备份。mode
:文件的属性。owner
:文件的属主。group
:文件的属组。
2、replace 模块使用示例
1、将/etc/hosts
文件中的old.host.name
修改为new.host.name
:
- name: Before Ansible 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
replace:
path: /etc/hosts
regexp: '(\s+)old\.host\.name(\s+.*)?$'
replace: '\1new.host.name\2'
2、注释 Apache 配置文件/etc/apache2/sites-available/default.conf
中NameVirtualHost [*]
行之后的所有内容:
- name: Replace after the expression till the end of the file (requires Ansible >= 2.4)
replace:
path: /etc/apache2/sites-available/default.conf
after: 'NameVirtualHost [*]'
regexp: '^(.+)$'
replace: '# \1'
3、注释 Apache 配置文件/etc/apache2/sites-available/default.conf
中# live site config
行之前的所有内容:
- name: Replace before the expression till the begin of the file (requires Ansible >= 2.4)
replace:
path: /etc/apache2/sites-available/default.conf
before: '# live site config'
regexp: '^(.+)$'
replace: '# \1'
4、注释 Apache 配置文件/etc/apache2/sites-available/default.conf
中<VirtualHost [*]>
行和</VirtualHost>
行之间的内容:
# Prior to Ansible 2.7.10, using before and after in combination did the opposite of what was intended.
# see https://github.com/ansible/ansible/issues/31354 for details.
- name: Replace between the expressions (requires Ansible >= 2.4)
replace:
path: /etc/apache2/sites-available/default.conf
after: '<VirtualHost [*]>'
before: '</VirtualHost>'
regexp: '^(.+)$'
replace: '# \1'
5、删除jdoe
用户 SSH 的known_hosts
文件中的old.host.name
及之后的空行,同时修改文件属性和权限:
- name: Supports common file attributes
replace:
path: /home/jdoe/.ssh/known_hosts
regexp: '^old\.host\.name[^\n]*\n'
owner: jdoe
group: jdoe
mode: '0644'
6、修改/etc/apache/ports
文件并校验:
- name: Supports a validate command
replace:
path: /etc/apache/ports
regexp: '^(NameVirtualHost|Listen)\s+80\s*$'
replace: '\1 127.0.0.1:8080'
validate: '/usr/sbin/apache2ctl -f %s -t'
7、简短的格式:
- name: Short form task (in ansible 2+) necessitates backslash-escaped sequences
replace: path=/etc/hosts regexp='\\b(localhost)(\\d*)\\b' replace='\\1\\2.localdomain\\2 \\1\\2'
8、多行的格式:
- name: Long form task does not
replace:
path: /etc/hosts
regexp: '\b(localhost)(\d*)\b'
replace: '\1\2.localdomain\2 \1\2'
9、明确指定替换中的位置匹配组:
- name: Explicitly specifying positional matched groups in replacement
replace:
path: /etc/ssh/sshd_config
regexp: '^(ListenAddress[ ]+)[^\n]+$'
replace: '\g<1>0.0.0.0'
10、明确指定命名匹配的组:
- name: Explicitly specifying named matched groups
replace:
path: /etc/ssh/sshd_config
regexp: '^(?P<dctv>ListenAddress[ ]+)(?P<host>[^\n]+)$'
replace: '#\g<dctv>\g<host>\n\g<dctv>0.0.0.0'