ansible系列文章
ansible學習系列之tags的使用
ansible學習系列之順利啓動後臺程序
ansible學習系列之make模塊的使用
ansible學習系列之become的使用
ansible學習系列之lineinfile模塊的使用
場景
最近,在編寫ansible腳本的時候,有時候需要對配置文件做修改操作,如新增語句等。而這個操作要求冪等性,不能每次啓動腳本的時候,相同的新增語句被重複執行。比如,執行新增操作的時候,每次啓動腳本時,只有當配置文件不存在,才新增進去。這個時候就可以使用lineinfile
模塊來實現這個功能。
環境
軟件 | 版本 |
---|---|
Ansible | 2.9.4 |
Python | 2.7.5 |
Centos | 7 |
正文
簡介
該模塊確保文件中包含特定行,或使用向後引用的正則表達式替換現有行。 當您只想更改文件中的單行時,那這個模塊就可以使用。如果要更改多行相似的行,請參見 replace 模塊;如果要在文件中插入/更新/刪除一行行,請查看 blockinfile。對於其他情況,請參見 copy 或 template 模塊。
參數
參數 | 默認 | 是否必需 | 含義 |
---|---|---|---|
attributes | 否 | 結果文件或目錄應具有的屬性。 要獲取支持的標誌,請查看目標系統上chattr 的手冊頁。 此字符串應包含與lsattr 顯示的屬性順序相同的屬性。 默認設置爲= 運算符,否則需要在字符串中包含+ 或- 運算符。 |
|
backrefs | 默認no ,可選:yes /no |
否 | 與state=present 一起使用。如果已設置,則行可以包含在regexp 匹配時將填充的反向引用(位置引用和命名引用)。此參數稍微更改模塊的操作;insertbefore 和insertafter 將被忽略,如果regexp 與文件中的任何地方都不匹配,則文件將保持不變。如果regexp 匹配,則最後一個匹配行將被擴展行參數替換。 |
backup | 默認no ,可選:yes /no |
否 | 創建一個包含時間戳信息的備份文件,以便在不正確地刪除原始文件時可以將其取回。 |
create | 默認no ,可選:yes /no |
否 | 與state=present 一起使用。如果已指定,則將在文件不存在時創建該文件。默認情況下,如果文件丟失,它將失敗。 |
firstmatch | 默認no ,可選:yes /no |
否 | 與insertafter 或insertbefore 一起使用。如果已設置,insertafter 和insertbefore 將處理與給定正則表達式匹配的第一行。 |
group | 否 | 應該擁有文件/目錄的組的名稱,將被輸入chown 。 |
|
insertafter | 默認EOF |
否 | 與state=present 一起使用。如果指定,則該行將插入到指定正則表達式的最後一個匹配項之後。如果需要第一個匹配項,請使用(first match=yes )。有一個特殊值可用;EOF 用於在文件末尾插入行。如果指定的正則表達式沒有匹配項,則將改用EOF 。如果設置insertbefore ,則將忽略默認值EOF 。如果正則表達式同時傳遞給regexp 和insertafter ,則只有在找不到regexp的匹配項時纔會使用insertafter 。不能與backrefs 或insertbefore 一起使用。 |
insertbefore | 默認 BOF |
否 | 與state=present 一起使用。如果指定,則該行將插入到指定正則表達式的最後一個匹配項之前。如果需要第一個匹配項,請使用first match=yes 。有一個值可用;BOF 用於在文件開頭插入行。如果指定的正則表達式沒有匹配項,則該行將插入文件末尾。如果正則表達式同時傳遞給regexp 和insertbefore ,則只有在找不到regexp 的匹配項時才使用insertbefore 。不能與backrefs 或insertafter 一起使用。 |
line | 否 | 要插入/替換到文件中的行。state=present 時必需。如果設置了backrefs ,則可能包含在regexp 匹配時將與regexp 捕獲組一起展開的backreferences 。 |
|
mode | 否 | 結果文件或目錄應具有的權限。對於那些使用/usr/bin/chmod 的模式,請記住模式實際上是八進制數。必須添加前導零,以便Ansible 的YAML 解析器知道它是一個八進制數(如0644 或01777 ),或者引用它(如644 或1777 ),以便Ansible 接收一個字符串並可以自己從字符串轉換爲數字。給ansibe 一個數字而不遵循這些規則中的任何一條,最後會得到一個十進制數,這將產生意外的結果。從Ansible 1.8 開始,模式可以指定爲符號模式(例如,u+rwx 或u=rw ,g=r ,o=r )。從ansibe2.6 開始,模式也可以是特殊的字符串保留。設置爲保留文件時,將授予與源文件相同的權限。 |
|
others | 否 | 文件模塊接受的所有參數也在這裏工作。 | |
owner | 否 | 應該擁有該文件/目錄的用戶的名稱,該名稱將被饋送給chown 。 |
|
path | 是 | 要修改的文件。 在ansibe2.3 之前,這個選項只能用作dest 、destfile 和name 。 |
|
regexp | 否 | 要在文件的每一行中查找的正則表達式。對於state=present ,如果找到要替換的模式。只會替換找到的最後一行。對於state=absent ,要刪除的行的模式。如果正則表達式不匹配,則該行將按照insertbefore 或insertafter 設置添加到文件中。當修改一行時,regexp 通常應該匹配行的初始狀態以及行替換後的狀態,以確保等冪性。使用Python 正則表達式。請參見http://docs.python.org/2/library/re.html |
|
selevel | 默認 s0 |
否 | SELinux 文件上下文的級別部分。這是MLS/MCS 屬性,有時稱爲範圍。當設置爲默認值時,它將使用策略的級別部分(如果可用)。 |
serole | 否 | SELinux 文件上下文的角色部分。當設置爲默認值時,它將使用策略的角色部分(如果可用)。 |
|
setype | 否 | SELinux 文件上下文的類型部分。當設置爲默認值時,它將使用策略的類型部分(如果可用)。 |
|
seuser | 否 | SELinux 文件上下文的用戶部分。默認情況下,它使用系統策略(如果適用)。當設置爲默認值時,它將使用策略的用戶部分(如果可用)。 |
|
state | 否 | 決定line 參數的值是否需要存入或刪除 |
|
unsafe_writes | 默認no ,可選:yes /no |
否 | 影響何時使用原子操作以防止數據損壞或從目標文件讀取不一致。默認情況下,此模塊使用原子操作來防止數據損壞或從目標文件中進行不一致的讀取,但有時系統的配置或只是以防止這種情況發生的方式中斷。一個例子是docker 掛載的文件,它不能從容器內部進行原子更新,只能以不安全的方式寫入。此選項允許Ansible 在原子操作失敗時返回到更新文件的不安全方法(但是,它不強制Ansible 執行不安全的寫入)。重要!不安全的寫入會受到競爭條件的影響,並可能導致數據損壞。 |
validate | 否 | 複製之前要運行的驗證命令。要驗證的文件的路徑是通過’%s’傳入的,該路徑必須如下面的示例中所示。該命令被安全地傳遞,因此諸如擴展和管道之類的shell 功能將不起作用 |
樣例
官方樣例
# NOTE: Before 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=enforcing
- name: Make sure group wheel is not in the sudoers configuration
lineinfile:
path: /etc/sudoers
state: absent
regexp: '^%wheel'
- name: Replace a localhost entry with our own
lineinfile:
path: /etc/hosts
regexp: '^127\.0\.0\.1'
line: 127.0.0.1 localhost
owner: root
group: root
mode: '0644'
- name: Ensure the default Apache port is 8080
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: Listen 8080
- name: Ensure we have our own comment added to /etc/services
lineinfile:
path: /etc/services
regexp: '^# port for http'
insertbefore: '^www.*80/tcp'
line: '# port for http by default'
- name: Add a line to a file if the file does not exist, without passing regexp
lineinfile:
path: /tmp/testfile
line: 192.168.1.99 foo.lab.net foo
create: yes
# NOTE: Yaml requires escaping backslashes in double quotes but not in single quotes
- name: Ensure the JBoss memory settings are exactly as needed
lineinfile:
path: /opt/jboss-as/bin/standalone.conf
regexp: '^(.*)Xms(\\d+)m(.*)$'
line: '\1Xms${xms}m\3'
backrefs: yes
# NOTE: Fully quoted because of the ': ' on the line. See the Gotchas in the YAML docs.
- name: Validate the sudoers file before saving
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%ADMIN ALL='
line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
validate: /usr/sbin/visudo -cf %s
修改配置文件示例
- name: 修改配置文件 /etc/ld.so.conf
lineinfile :
path: /etc/ld.so.conf
regexp: '{{microservice_lboso_install_path}}'
line: '{{microservice_lboso_install_path}}'
become: yes
參考鏈接
list_of_files_modules
lineinfile_module
總結
工作中遇到問題,即使沒辦法及時解決,也要放在心裏,抽時間去解決,不然就會形成技術債。或許可以告訴自己,問題解決了就好。但是,如果不追求極限,只追求簡單地搞定,技術是不會有大的突破的。
隨緣求贊
如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注