如何用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