ansible學習系列之lineinfile模塊的使用

ansible系列文章

ansible學習系列之tags的使用
ansible學習系列之順利啓動後臺程序
ansible學習系列之make模塊的使用
ansible學習系列之become的使用
ansible學習系列之lineinfile模塊的使用

場景

最近,在編寫ansible腳本的時候,有時候需要對配置文件做修改操作,如新增語句等。而這個操作要求冪等性,不能每次啓動腳本的時候,相同的新增語句被重複執行。比如,執行新增操作的時候,每次啓動腳本時,只有當配置文件不存在,才新增進去。這個時候就可以使用lineinfile模塊來實現這個功能。

環境

軟件 版本
Ansible 2.9.4
Python 2.7.5
Centos 7

正文

簡介

該模塊確保文件中包含特定行,或使用向後引用的正則表達式替換現有行。 當您只想更改文件中的單行時,那這個模塊就可以使用。如果要更改多行相似的行,請參見 replace 模塊;如果要在文件中插入/更新/刪除一行行,請查看 blockinfile。對於其他情況,請參見 copytemplate 模塊。

參數

參數 默認 是否必需 含義
attributes 結果文件或目錄應具有的屬性。 要獲取支持的標誌,請查看目標系統上chattr的手冊頁。 此字符串應包含與lsattr顯示的屬性順序相同的屬性。 默認設置爲=運算符,否則需要在字符串中包含+-運算符。
backrefs 默認no,可選:yes/no state=present一起使用。如果已設置,則行可以包含在regexp匹配時將填充的反向引用(位置引用和命名引用)。此參數稍微更改模塊的操作;insertbeforeinsertafter將被忽略,如果regexp與文件中的任何地方都不匹配,則文件將保持不變。如果regexp匹配,則最後一個匹配行將被擴展行參數替換。
backup 默認no,可選:yes/no 創建一個包含時間戳信息的備份文件,以便在不正確地刪除原始文件時可以將其取回。
create 默認no,可選:yes/no state=present一起使用。如果已指定,則將在文件不存在時創建該文件。默認情況下,如果文件丟失,它將失敗。
firstmatch 默認no,可選:yes/no insertafterinsertbefore一起使用。如果已設置,insertafterinsertbefore將處理與給定正則表達式匹配的第一行。
group 應該擁有文件/目錄的組的名稱,將被輸入chown
insertafter 默認EOF state=present一起使用。如果指定,則該行將插入到指定正則表達式的最後一個匹配項之後。如果需要第一個匹配項,請使用(first match=yes)。有一個特殊值可用;EOF用於在文件末尾插入行。如果指定的正則表達式沒有匹配項,則將改用EOF。如果設置insertbefore,則將忽略默認值EOF。如果正則表達式同時傳遞給regexpinsertafter,則只有在找不到regexp的匹配項時纔會使用insertafter。不能與backrefsinsertbefore一起使用。
insertbefore 默認 BOF state=present一起使用。如果指定,則該行將插入到指定正則表達式的最後一個匹配項之前。如果需要第一個匹配項,請使用first match=yes。有一個值可用;BOF用於在文件開頭插入行。如果指定的正則表達式沒有匹配項,則該行將插入文件末尾。如果正則表達式同時傳遞給regexpinsertbefore,則只有在找不到regexp的匹配項時才使用insertbefore。不能與backrefsinsertafter一起使用。
line 要插入/替換到文件中的行。state=present時必需。如果設置了backrefs,則可能包含在regexp匹配時將與regexp捕獲組一起展開的backreferences
mode 結果文件或目錄應具有的權限。對於那些使用/usr/bin/chmod的模式,請記住模式實際上是八進制數。必須添加前導零,以便AnsibleYAML解析器知道它是一個八進制數(如064401777),或者引用它(如6441777),以便Ansible接收一個字符串並可以自己從字符串轉換爲數字。給ansibe一個數字而不遵循這些規則中的任何一條,最後會得到一個十進制數,這將產生意外的結果。從Ansible 1.8開始,模式可以指定爲符號模式(例如,u+rwxu=rwg=ro=r)。從ansibe2.6開始,模式也可以是特殊的字符串保留。設置爲保留文件時,將授予與源文件相同的權限。
others 文件模塊接受的所有參數也在這裏工作。
owner 應該擁有該文件/目錄的用戶的名稱,該名稱將被饋送給chown
path 要修改的文件。 在ansibe2.3之前,這個選項只能用作destdestfilename
regexp 要在文件的每一行中查找的正則表達式。對於state=present,如果找到要替換的模式。只會替換找到的最後一行。對於state=absent,要刪除的行的模式。如果正則表達式不匹配,則該行將按照insertbeforeinsertafter設置添加到文件中。當修改一行時,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

總結

工作中遇到問題,即使沒辦法及時解決,也要放在心裏,抽時間去解決,不然就會形成技術債。或許可以告訴自己,問題解決了就好。但是,如果不追求極限,只追求簡單地搞定,技術是不會有大的突破的。

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注
拜拜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章