Ansible lineinfile模塊詳解


簡介

之所以專門說一說這個模塊,是因為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

參考:http://blog.51cto.com/zouqingyun/1882367


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM