如何使用 Ansible 替换文件中的字符串

Ansible 有一个 ‘replace’、’blockinfile’ 和 ‘lineinfile’ 模块用于处理文件中的行。 它们中的每一个都用于特定目的。 选择其中之一取决于情况。

我们将涵盖什么?

在这篇文章中,我们将探讨如何使用 Ansible 替换文件中的任何字符串。 Ansible 有一个用于相同目的的“ansible.builtin.replace”模块。 让我们探索下面的替换模块。

Replace 模块的一般语法如下:

- name: Name of the task

ansible.builtin.replace:

path: path of the file that needed to be changed

regexp: regex expression for old string to be replaced

replace: new string that needs to be added to file

让我们看看一些 example 下面的剧本。 下面的剧本将检查提供的路径中的主机文件,并将旧主机名(managed1.anslab.com)替换为新主机名(linuxhint.com):

---

- hosts: managed1(Name of your target node)

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/hosts

regexp: '(s+)managed1.anslab.com(s+.*)?$'

replace: '1linuxhint.com2'

你可以在下面看到这个剧本的输出。 它将文件中所有出现的“managed1.anslab.com”替换为“linuxhint.com”。

我在这里使用正则表达式。 正则表达式有助于匹配多个字符串或单个字符串。 在此处了解有关 python 正则表达式的更多信息 https://docs.python.org/3/library/re.html.

现在,让我们探索这个模块的其他参数:

1.“之后”

当我们有 ‘after’ 参数和 ‘replace’ 时,它是 ‘after’ 参数,内容的替换将从这里实际开始,并一直持续到文件末尾。

为了更清楚,让我们看看下面的剧本。 在这里,我们将“after”参数值设置为“PubkeyAuthentication”。 遇到“PubkeyAuthentication”字符串后,会将“yes”替换为“no”。

句法:

- name: Syntax for Replace module with the ‘after’ expression.

ansible.builtin.replace:

path: path of the file

after: word after which replacement starts

regexp: regular expression to match the word that needs to be changed

replace: string that will replace old word

在下面的剧本中,观察 ‘after’ 表达式的用法:

---

- hosts: managed1 (Name of your target node)

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/ssh/sshd_config

regexp: 'yes'

after: 'PubkeyAuthentication'

replace: 'no'

如果您检查下面的输出,您可能会注意到字符串“PubkeyAuthentication”之后。 字符串“yes”现在被替换为“no”。 我正在使用 sed 从文件中只获取一行以便于查看。

2.“之前”

“之前”与“之后”相反。 它将替换为 ‘before’ 参数指定的每个匹配字符串。

句法:

- name: Syntax for Replace module with the ‘before’ expression.

ansible.builtin.replace:

path: path of the file that needs to be updated

before: before this word, it will match the regex and replace it with new word

regexp: regular expression to match the word to be changed

replace: string that will replace the old word

让我们看看一个 example 同样的剧本。 下面的剧本使用’before’关键字:

---

- hosts: managed1(Name of your target node)

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/hosts

before: 'managed1'

regexp: 'linuxhint.com'

replace: 'linuxways.net'

在上面的剧本中,在“managed1”这个词之前,如果有任何类似“linuxhint.com”的字符串,为了简单起见,它将被替换为“linuxways.net”。 在这里,我没有使用任何复杂的正则表达式。 您可以在上面的屏幕截图中看到运行输出之前和之后的文件。

3.“之前和之后”

您还可以同时使用 before 和 after 参数来替换两者之间的单词。

句法:

- name: Syntax for Replace module with the ‘before’ and ‘after’ expressions.

ansible.builtin.replace:

path: path of the file

after: after this word the word will be replaced

before: before this word the word will be replaced

regexp: regular expression to match the word to be replaced

replace: string that will replace old word

现在,让我们看一个简单的 example 下面的剧本演示了之前和之后。

---

- hosts: managed1

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/hosts

after: '127.0.2.1'

before: 'managed1'

regexp: 'linuxways.net'

replace: 'tecofers.com'

在上面的剧本中,您可以清楚地观察到“managed1”之前和“127.0.2.1”字符串之后的字符串被替换为字符串“tecofers.com”。

更进一步,这个模块还有一些更有趣的属性,因为 example 备份.

4.“备份”

“备份”属性有两个选项,可以设置为“是”或“否”。 如果您将备份设置为是,它将创建原始文件的备份文件及其时间戳。 因此,如果您弄乱了原始文件,您可以参考备份文件(建议用于生产系统)。

结论

在本指南中,我们看到了 Ansible 中“替换”模块用于替换文件中的字符串的用法。 此外,您可以参考官方 ansible 文档了解更多与此模块相关的参数。