ansible常用模块之 -- replace模块 – 使用反向引用正则表达式替换文件中特定字符串的所有实例

Ansible的replace模块用于在文件中使用正则表达式替换特定字符串。支持正则表达式的多种特性,如反向引用和模式匹配。此外,还支持文件属性设置及验证命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ansible常用模块之 -- replace模块 – 使用反向引用正则表达式替换文件中特定字符串的所有实例

replace模块 – 使用反向引用正则表达式替换文件中特定字符串的所有实例

一、摘要

  • 该模块将替换文件中模式的所有实例
  • 用户可以通过确保相同的模式永远不会匹配任何替换来维持幂等性

二、参数

参数选项/默认值描述
after
string
如果指定,则只替换/删除匹配之后的内容。
可与 before 结合使用。
使用Python正则表达式;见http://docs.python.org/2/library/re.html。
使用DOTALL,这意味着。特殊字符可以匹配换行符。
attributes
string
生成的文件或目录应该具有的属性。
要获得支持的标志,请查看目标系统上的chatr手册页。
该字符串应该包含与lsattr显示的相同顺序的属性。
= 操作符为默认值,否则需要在字符串中包含 + 或 - 操作符。
backup
boolean
· no ←
· yes
创建一个包含时间戳信息的备份文件,以便在不正确地损坏原始文件时可以恢复原始文件。
before
string
如果指定,则只替换/删除匹配之前的内容。
可与 after 结合使用。
使用Python正则表达式;见http://docs.python.org/2/library/re.html。
使用DOTALL,这意味着。特殊字符可以匹配换行符。
encoding
string
Default:“utf-8”用于读写文件的字符编码。
group
string
应该拥有该文件/目录的组的名称,将提供给chown。
mode
string
生成的文件或目录应该具有的权限。
对于那些习惯了/usr/bin/chmod的人来说,记住模式实际上是八进制数。你必须添加一个前导零,这样Ansible的YAML解析器就知道这是一个八进制数(比如0644或01777),或者引用它(比如’644’或’1777’),这样Ansible就可以接收到一个字符串,并可以进行自己的从字符串到数字的转换。
给Ansible一个不遵循这些规则的数字将会得到一个十进制数,这将会产生意想不到的结果。
从Ansible 1.8开始,模式可以指定为符号模式(例如,u+rwx或u=rw,g=r,o=r)。
others
string
文件模块接受的所有参数在这里也适用。
owner
string
应该拥有该文件/目录的用户名,将提供给chown。
path
path
required
要修改的文件。
regexp
string
required
要在文件内容中查找的正则表达式。
使用Python正则表达式;见http://docs.python.org/2/library/re.html。
使用MULTILINE模式,这意味着和$匹配文件的开头和结尾,以及文件每一行的开头和结尾。<br>不使用DOTALL,这意味着。特殊字符匹配除换行符以外的任何字符。一个常见的错误是假设像[#]这样的否定字符集也不会匹配换行符。
为了排除换行符,它们必须像[^#\n]那样添加到集合中。
注意,从Ansible 2.0开始,短形式任务应该有任何反斜杠转义序列,以防止它们被解析为字符串字面转义。看到的例子。
replace
string
要替换regexp的字符串匹配。
可以包含反向引用,如果regexp匹配,则使用regexp捕获组展开这些引用。
如果未设置,则完全删除匹配。
反向引用可以像\1那样模棱两可地使用,也可以像\g<1>那样显式地使用。
selevel
string
Default:“s0”SELinux文件上下文的 level 部分。
这是MLS/MCS属性,有时称为范围。
当设置为_default时,它将使用策略的级别部分(如果可用的话)。
serole
string
SELinux文件上下文的角色部分。
当设置为_default时,它将使用策略的角色部分(如果可用的话)
setype
string
SELinux文件上下文的类型部分。
当设置为_default时,它将使用策略的类型部分(如果可用的话)。
seuser
string
SELinux文件上下文的用户部分。
默认情况下,它使用系统策略。
当设置为_default时,它将使用策略的用户部分(如果可用的话)。
unsafe_writes
boolean
· no ←
· yes
影响何时使用原子操作以防止数据损坏或从目标文件读取不一致。
默认情况下,该模块使用原子操作来防止数据损坏或从目标文件读取不一致,但有时系统的配置或破坏会防止这种情况发生。一个例子是docker装载的文件,它不能从容器内部原子地更新,只能以不安全的方式写入。
这个选项允许Ansible在原子操作失败时使用不安全的方法更新文件(然而,它并不强制Ansible执行不安全的写操作)。
重要!不安全的写操作会受到竞争条件的影响,并可能导致数据损坏。
validate
string
复制到位之前要运行的验证命令。
要验证的文件的路径是通过’%s '传入的,它必须像下面的示例中一样显示。
该命令是安全传递的,因此shell功能如扩展和管道将不起作用。

三、示例

# 在Ansible 2.3之前,选项'dest', 'destfile'或'name'被使用,而不是'path'
- 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'

# 替换表达式之后,直到文件结束(需要Ansible >= 2.4)
- 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'

# 替换之前的表达式直到文件的开始(需要Ansible >= 2.4)
- 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'

# 在Ansible 2.7.10之前,将before和after组合使用与预期相反。
# 替换表达式之间(需要Ansible >= 2.4)
- name: Replace between the expressions (requires Ansible >= 2.4)
  replace:
    path: /etc/hosts
    after: '<VirtualHost [*]>'
    before: '</VirtualHost>'
    regexp: '^(.+)$'
    replace: '# \1'

# 支持通用文件属性
- name: Supports common file attributes
  replace:
    path: /home/jdoe/.ssh/known_hosts
    regexp: '^old\.host\.name[^\n]*\n'
    owner: jdoe
    group: jdoe
    mode: '0644'

# 支持validate命令
- 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'

# 短形式任务(在ansible 2+中)需要反斜杠转义序列
- 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'

# 长篇任务则不然
- name: Long form task does not
  replace:
    path: /etc/hosts
    regexp: '\b(localhost)(\d*)\b'
    replace: '\1\2.localdomain\2 \1\2'

# 显式指定替换中的位置匹配组
- name: Explicitly specifying positional matched groups in replacement
  replace:
    path: /etc/ssh/sshd_config
    regexp: '^(ListenAddress[ ]+)[^\n]+$'
    replace: '\g<1>0.0.0.0'

# 显式指定已命名的匹配组
- 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'

官方文档:https://docs.ansible.com/ansible/2.9/modules/replace_module.html#replace-module

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值