如何用Ansible替換字符串和行

Ansible提供了多種方法,可用於替換與特定模式匹配的字符串,整行或單詞。 您可以使用兩個模塊來實現此目的:replace模塊和inline模塊。 我們將深入探討一些示例,說明如何在劇本中使用這些模塊替換字符串和行。

使用Ansible替換文件中的字符串

替換模塊替​​換文件中已定義字符串的所有實例。

如果字符串不存在,則不會執行任何操作,也不會顯示錯誤。 Ansible只是返回什麼都沒有改變。 要成功替換文件中的字符串,需要三個參數:

  • 以“ path”指令表示的文件位置。
  • ‘regexp’指令–要替換或更改的字符串。 此外,您可以傳遞任何正則Python表達式。
  • “替換”指令–這是替換單詞或字符串。

這是replace模塊的語法:

- replace:
    path: /path/to/file
    regexp: 'string or regular expression for search'
    replace: 'word to replace the search string'
    backup: yes

我有一個名為sample.txt的示例文本文件,其內容如下。

Unix是供開發人員和桌面愛好者使用的免費開源系統。 由於Linux Torvalds的努力,Unix逐漸成為最受歡迎的開源系統。

目標是將字符串“ Unix”替換為“ Linux”。 為此,我們將如圖所示創建一個劇本文件。

- hosts: 127.0.0.1
  tasks:
  - name: Ansible replace string example
    replace:
      path: /etc/ansible/sample.txt
      regexp: 'Unix'
      replace: "Linux"

然後,我們將運行該劇本。

# ansible-playbook sample.txt

從輸出中,您可以清楚地看到字符串“ Unix”已被“ Linux”替換。

讓我們再舉一個例子。

我們的第二個目標是將/ etc / hosts文件中的主機名條目從server.myubuntu.com更改為server.linuxtechi.info

我們將創建一個劇本文件change_hostname.yml,如下所示:

- hosts: 127.0.0.1
  tasks:
  - name: Ansible replace string example
    replace:
      path: /etc/hosts
      regexp:  '(s+)server.myubuntu.com(s+.*)?$'
      replace: '1server.linuxtechi.info2'

更改主機名

運行劇本後,域名將相應更改,如下所示:

# ansible-playbook change_hostname.yml

運行Playbook更改主機名

Ansible lineinfile模塊

Ansible內聯模塊可以以多種方式使用。 它可用於插入新行,從文件中刪除或修改現有行。 我們將仔細研究每一個。

在文件末尾插入一行(EOF)

首先,我們將學習如何創建行(如果文件中不存在)。 首先使用path屬性指定要在其中添加行的文件的路徑。 這已替換了Ansible 2.3和更早版本中使用的dest選項。

然後指定要在EOF添加的行。 在這種情況下,我們將新條目添加到/ etc / hosts文件中。 如果該行已存在,則Ansible將跳過添加該行,並且不會進行任何更改。

state參數指示Ansible將行寫入文件,而create參數則指示Ansible創建文件(如果尚不存在)。 這是update_ip.yml劇本文件。

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/hosts
        line: '173.82.56.150 wwww.linuxtechi.io'
        state: present
        create: yes

Ansible-Playbook在線使用

運行劇本文件時,請注意已添加了新條目或新行。

# ansible-playbook update_ip.yml

內聯Playbook執行結果

在之前或之後插入一行

有時,您可能想在文件的一部分之前或之後插入新行,而並不總是在該行的末尾插入新行。 為此,您需要使用insertafter和insertbefore指令。

在下面的手冊中,我們在以下位置添加一行以指定首選的清單文件 [defaults] ansible.cfg文件中的部分。 我們逃脫了 [] 因為它們是正則表達式字符。

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/ansible/ansible.cfg
        line: 'inventory  = /home/linuxtechi/hosts'
        insertafter: '[defaults]'

匹配模式後插入行

要在參數之前添加一行,請使用“ insertbefore”參數。 在下面的示例中,我們在Ansible配置文件中的#library模式之前添加了同一行。

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/ansible/ansible.cfg
        line: 'inventory  = /home/linuxtechi/hosts'
        insertbefore: ‘#library’

使用lineinfile模塊刪除一行

這與添加一條線完全相反。 一種簡單的實現方法是將state參數設置為不存在。 例如,要刪除文件中的條目,請確保state參數缺少值

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/hosts
        line: ‘173.82.56.150 wwwwlinuxtechi.io’
        state: absent

刪除行與Ansible-Playbook執行

刪除行的另一種方法是使用regexp參數。 例如,下面的劇本刪除了Unix單詞開頭的文件中的所有行。

- hosts: 127.0.0.1
  tasks:
    - name: Ansible lineinfile regexp example
      lineinfile:
        dest: /etc.ansible/sample.txt
        regexp: '^Unix'
        state: absent

這就是本文的全部內容,希望對理解如何用Ansible替換字符串和行有幫助。

另請閱讀 Linux中的9 tee命令示例

Sidebar