一个专注于IT互联网运维的技术博客

Ansible字符串替换模块replace

2019.05.25

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 模块使用示例

参考replace – Replace all instances of a particular string in a file using a back-referenced regular expression

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.confNameVirtualHost [*]行之后的所有内容:

- 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'
发表评论