如何用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
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 update_ip.yml
在之前或之後插入一行
有時,您可能想在文件的一部分之前或之後插入新行,而並不總是在該行的末尾插入新行。 為此,您需要使用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
刪除行的另一種方法是使用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命令示例