12.ansible lineinfile模块 replace内容替换模块
一.lineinfile模块,功能有点类似sed
常用功能:对文件的行替换、插入、删除
PS:
替换/插入:如果有重复的,都是匹配最后一个 ,
如果不加backrefs项, 替换/插入如无匹配者,则将line所指定的行插入到文件的末尾
删除:如果有重复的,全部删除
常用参数:
path/dest: 目标文件绝对路径+文件名,必须参数
line: 替换/插入的内容
regexp: 待匹配内容
insertbefore: 匹配行前面插入
insertafter: 匹配行面插入
state: 删除匹配行,需要将值设为absent,默认值present。
backup: 是否在修改文件之前对文件进行备份。 yes/no
create: 当要操作的文件并不存在时,是否创建对应的文件。yes/no
backrefs:yes/no
1.backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容。
2.backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。
举个栗子:
vim lineinfile.yaml
- hosts: node
gather_facts: no
become: yes
become_method: sudo
tasks
1、备份文件
- name: 'backup file'
lineinfile:
path: /root/config
backup: yes
line: state=present
2、替换整行
- name: '替换'
lineinfile:
path: /root/config
regexp: '^SELINUX='
line: '此行已被我替换了'
3、在匹配行前面插入
- name: '在匹配行前面插入'
lineinfile:
path: /root/config
insertbefore: 'SELINUXTYPE=targeted'
line: '成功在匹配行前面插入一行'
4、在匹配行后面插入
- name: "在匹配行后面插入"
lineinfile:
dest: /root/config
insertafter: 'minimum - Modification of targeted policy.'
line: 成功在匹配行后面插入一行'
5、删除匹配行
- name: '删除匹配行'
lineinfile:
dest: /root/config
regexp: 'J\+sZc\_j\!s\@d\#x'
state: absent
6、添加
- name: 'add a line'
lineinfile:
dest: /root/config
regexp: 'add a line!'
line: '我出现代表没有匹配项'
7、没有匹配,保持文件不变
- name: 'backrefs'
lineinfile:
dest: /root/config
backrefs: yes
regexp: 'add a line~~~'
line: '没有匹配项我也不会出现在文件中'
8、新建
- name: 'create'
lineinfile:
dest: /root/test.txt
create: yes
line: state=present
9.insertafter insertbeforce也支持正则
- name: Modify Zabbix Super User
lineinfile:
path: /etc/sudoers
insertafter: '^root'
line: 'zabbix ALL = NOPASSWD: ALL'
二.replace模块用于在文件中根据指定的正则表达式替换匹配的内容
replace模块常用参数
• path:必须参数,指定要修改的文件,2.3版本之前,这个参数叫dest、destfile、name;现在这三个名称是path参数的别名
• regexp:必须参数,指定一个正则表达式,可以是python正则
• replace:替换regexp参数匹配到的字符串,
• owner:结果文件或目录的所属用户名,相当于chown命令修改
• group:结果文件或目录的所属组名,相当于chown命令修改
• mode:结果文件或目录的权限,与chmod命令不一致的是,replace模块的mode参数需要添加前导零,以便ansible的YAML解析器知道它是八进制;1.8版本后可以设置为符号模式(u+rwx或u=rw),2.6版本后可以是特殊字符串(preserve),当设置为’preserve’时,文件将被赋予与源文件相同的权限。
• others:可以指定file模块的所有参数
• encoding:用于读取和写入文件的字符编码
• before:如果指定,则仅替换/删除此匹配之前的内容,可以和after参数结合使用
• after:如果指定,则仅替换/删除此匹配之后的内容,可以和before参数结合使用
• attributes:结果文件或目录的特殊属性,相当chattr,默认使用=运算符,指定文件或目录的某项属性
• backup:修改源文件前创建一个包含时间戳信息的备份文件
replace模块doc文档示例
- 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'
- 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'
- 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'
# 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/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'
- 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'
- 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'
replace模块示例
复制
- name: replace hostname
replace:
path: /root/hwreport.txt
regexp: "inventoryhostname"
replace: "{{ ansible_hostnam }}"
- name: replace disk vdb
replace:
path: /root/hwreport.txt
regexp: "disk_vdb_size"
replace: "{{ ansible_device.vdb.size }}"
when: "'vdb' in ansible_devices"
- name: replace disk vdb
replace:
path: /root/hwreport.txt
regexp: "disk_vdb_size"
replace: "NONE"
when: "'vdb' not in ansible_devices"