一、lineinfile模塊可以確保某一行文本存在於指定的文件中,或者確保從文件中刪除指定的文本,還可以根據正則表達式替換某一行文本。下面羅列一下lineinfile模塊的參數:
path:必須參數,指定要操作的文件
line:用來指定文本內容
regexp:使用正則表達式匹配對應的行,當替換文本時,如果有多行文本都能匹配,則只有最后面被匹配的行才會被替換,當刪除文本時,如果有多行文本被匹配,那么所有匹配行都將被刪除。
state:當想要刪除對應的文本時,需要將state參數的值設置為absent,默認為present
backrefs:默認情況下,當根據正則替換文本時,即使regexp參數中的正則存在分組,再line參數中也不能對正則中的分組行進行引用,除非將backrefs參數的值設置為yes,backrefs=yes表示開啟后向引用,這樣,line參數中就能對regexp參數中的分組進行后向引用了。backrefs=yes除了能開啟后向引用功能,還有另一個作用,默認情況下,當使用正則表達式替換對應行時,同時設置了backrefs=yes,那么當正則沒有匹配到任何的行時,則不會對文件進行任何操作,相當於保持文件不變。
insertafter:借助insertafter可以將文本插入到指定的行后,insertafter參數的值可以設置為EOF或者正則表達式,默認為EOF,如果將insertafter的值設置為正則表達式,表示將文本插入到匹配到正則的行后,如果正則沒有匹配到任何行,則插入到文件末尾,當使用backrefs參數時,此參數將會被忽略。
insertbefore:將文本插入到指定行之前,insertbefore的值可以設置為BOF或者正則表達式,BOF為Begin Of File,表示插入到文檔開頭,默認BOF,如果將insertbefore設置為正則表達式,表示將文本插入到匹配到正則的行之前,如果正則沒有匹配到任何行,則插入到文件末尾,當使用backrefs參數時,此參數被忽略。
backup:是否在修改文件之前對文件進行備份。默認為false
create:當要操作的文件並不存在時,是否創建對應的文件。默認為false
示例文件:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
示例一:確保指定的一行文本存在於文件中,如果存在,則不做任何操作,如果不存在,默認在文件末尾加入:
示例二:根據正則表達式替換某一行,如果多行匹配,那么只有最后一行才會被替換,默認如果沒有匹配到任何行,那么line中的內容會被添加到文件末尾。
原文件則變為:
示例三:根據正則表達式替換某一行,如果多行被匹配,那么只有最后一行才會被替換;如果無任何行被匹配,那么對文件不進行任何操作:
示例四:根據正則表達式刪除匹配行,如果多行匹配,那么刪除所有匹配行:
示例五:根據line參數的內容刪除行,如果文件中有多行匹配,那么這些相同的行都會被刪除
后向引用:默認情況下,lineinfile模塊是不支持后向引用的,關於后向引用概念,可參考http://www.zsythink.net/archives/1952。如果將backrefs設置為yes,表示開啟后向引用。
示例原文件:
Hello every one
Hello my dear
Who is say Hello
Hello body is Hello boy
Hello dear is Hello god
示例六:將示例原文件中的第二行替換為Hello
替換后的文件:
示例七:將示例原文件中的第五行替換為Hello god
替換后的文件:
二、blockinfile模塊可以在指定的文件中插入一段文本,這段文本是被標記過的,以便在以后的操作中可以通過標記找到這段文本,然后修改或者刪除這段文本。參數如下:
path:必須參數,指定要操作的文件
block:用於指定一段文本,與content參數相同
marker:用於指定標記符,即一個開始標記一個結束標記;默認開始標記為# BEGIN ANSIBLE MANAGED BLOCK,結束標記為# END ANSIBLE MANAGED BLOCK,使用marker自定義標記。{mark}為內置的BEGIN和END
state:有兩個可選值,present和absent,如果對應的文件中已經存在對應標記的文本,默認會更新對應段落,在執行插入操作或更新操作時,state的值為present,默認值即為present;如果對應的文件中已經存在對應標記的文本並且將state的值設置為absent,則表示從文件中刪除對應標記的段落。
insertafter:默認值為EOF,即在文件的末尾插入文本,使用此參數可在指定的行后插入。如果多行文本都能夠匹配對應的正則,則以最后一個滿足條件的行為准
insertbefore:默認值為BOF,即在文件的開頭插入文本。如果多行都能夠匹配對應的正則,則以最后一個滿足條件的行為准
backup:是否在修改文件之前對文件進行備份
create:當目標文件不存在時,是否創建
示例源文件:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
示例一:添加文本塊
修改后的文件:
示例二:自定義標記符
修改后的文件:
示例三:修改文件中的標記內容
修改后的文件:
示例四:刪除文件中的標記塊
修改后的文件:
PS:當state為absent時,參數block將失效,即使指定了,並且block中的內容在目標文件中匹配不到,也會刪除匹配到的marker,所以,在匹配的時候,是以marker進行匹配的,上例中也是反應的淋漓盡致。
示例五:在指定的行前插入block,多行匹配則以最后匹配行為准
修改后的文件: