簡介
之所以專門說一說這個模塊,是因為lineinfile在實際使用中非常有用。
實際上,在大多數時候,我們在linux上的操作,就是針對文件的操作,通過配置管理工具對配置文件作統一的配置修改是一個非常酷的功能。
下面是官方針對該模塊的說明:
lineinfile - Ensure a particular line is in a file, or replace an existing line using a back-referenced regular expression
簡單講,這個模塊就是針對一個文件中行內容的操作。
下面我們詳細說一說其具體可以做的事情。
修改匹配行
下面是一個簡單的task示例:
# 將/etc/selinux/config中匹配到以'SELINUX='開頭的行,將其替換為'SELINUX=disabled'
- name: modify selinux to disabled
lineinfile:
path: /etc/selinux/config
regex: '^SELINUX='
line: 'SELINUX=disabled'
在匹配行前或后添加內容
示例文件如下:
# cat /etc/http.conf
Listen 127.0.0.1:80
Listen 80
Port
在匹配行前添加
在http.conf文件的Listen 80
前面添加一行Listen 8080
,task示例如下:
- name: add line before Listen 80
lineinfile:
dest: /etc/http.conf
insertbefore: '^Listen 80'
line: 'Listen 8080'
在匹配行后添加
在http.conf文件的Port
后面添加一行just a test
,task示例如下:
- name: add line before Listen 80
lineinfile:
dest: /etc/http.conf
insertafter: '^Port'
line: 'just a test'
修改文件內容及權限
示例文件:
#cat /etc/hosts
127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6
192.168.0.130 hub.breezey.top
修改/etc/hosts,將以127.0.0.1
開頭的行替換為 127.0.0.1 localhost
,並將/etc/hosts的屬主和屬組都修改為root,權限改為644,如下:
- name: modify hosts
lineinfile:
dest: /etc/hosts
regex: '^127\.0\.0\.1'
line: '127.0.0.1 localhost'
owner: root
group: root
mode: 0644
刪除一行內容
示例原文件:
#cat /etc/hosts
127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6
192.168.0.130 hub.breezey.top
刪除以192.168.0.130
開頭的行:
- name: delete a line
lineinfile:
dest: /etc/hosts
regex: '^192\.168\.0'
state: absent
文件存在則添加一行內容
往/etc/hosts里添加一行192.168.0.131 test.breezey.top
(多次執行,不會重復添加),示例如下:
- name: add a line
lineinfile:
dest: /etc/hosts
line: '192.168.0.131 test.breezey.top'
如果有匹配的行則修改該行,如果不匹配則添加
示例原文件/tmp/test.txt內容如下:
# %wheel ALL=(ALL) ALL
下面的示例task中,匹配以%wheel
開頭的行,匹配到,則執行替換,未匹配,則添加。因為原文件中,沒有以%wheel
開頭的行,所以會添加一行:
- name: add or modify a line
lineinfile:
dest: /tmp/test.txt
regex: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
修改后的文件如下:
#cat /tmp/text.txt
# %wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
參數backrefs,backup說明
- backup: 是否備份原文件,默認為no
- backrefs:
- 當backrefs為no時,如果regex沒有匹配到行,則添加一行,如果Regx匹配到行,則修改該行
- 當backrefs為yes時,如果regex沒有匹配到行,則保持原文件不變,如果regex匹配到行,則修改該行
- backrefs默認為no,所以上面那個示例中,我們沒有配置backrefs,而默認沒有匹配,則修改。
下面我們看一看backrefs為yes時匹配到行的示例:
示例原文件:
# cat /tmp/testfile
# %wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
#?bar
task示例:
- name: test backrefs
lineinfile:
backup: yes
state: present
dest: /tmp/testfile
regexp: '^#\?bar'
backrefs: yes
line: 'bar'
修改后的文件:
# cat /tmp/testfile
# %wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
bar
使用validate驗證文件是否正確修改
在一些場景下,我們修改完文件后,需要對文件做一下測試,用以檢查文件修改之后,是否能正常運行。如http.conf、nginx.conf等,一旦改錯,而不加以測試,可能會直接導致http服務掛掉。
可以使用validate關鍵字,在修改完成以后,對文件執行檢測:
- name: test validate
lineinfile:
dest: /etc/sudoers
state: present
regexp: '^%ADMIN ALL='
line: '%ADMIN ALL=(ALL)'
validate: 'visudo -cf %s'
tags:
- testsudo