regex Ansible -替换文件中第一个出现的特定表达式-路径包括主机名

zzwlnbp8  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(96)

我需要替换特定文件中某个字符串的第一次出现。
我想使用Ansible的替换模块来实现这一点。

- hosts: abc
  tasks:
  - name: Replace first occurence of specific string
    replace:
      path: /etc/config/abc_host/application.yml
      regexp: 'Unix'
      replace: "Linux"

这将在这个特定的. yml文件中用Linux替换所有出现的Unix。但我还有一些其他主机(def_host,ghi_host等),我想只用Linux替换第一次出现的Unix
因此,有两个问题需要解决:
首先,使用主机名作为path中的变量,而不是硬编码abc_host.yml,我想要像path: /etc/config/($host)_host/application.yml这样的东西。
其次,我只想替换特定字符串的第一个出现(而不是它的任何其他后续出现)。

1cklez4t

1cklez4t1#

对于第一部分,您可以使用像ansible_hostnameinventory_hostname这样的变量,例如path: /etc/config/{{ ansible_hostname }}_host/application.yml(参见post了解差异)。
要解决第二部分问题,可以使用lineinfile模块,如下所示:

- name: Ansible replace string example
    ansible.builtin.lineinfile:
      path: /etc/config/{{ ansible_hostname }}_host/application.yml
      regexp: "Unix"
      line: "Linux"
      firstmatch: yes
      state: present
  • edit:已将模块更改为fqcn。*
dced5bon

dced5bon2#

你可以使用ansible after来替换只有在提到的关键字之后

- name: Replace project info 
  ansible.builtin.replace:
    path: /home/ec2-user/Info.yml
    after: 'versions:'
    regexp: '(^  test_tree_1:)(.*)$'
    replace: '\1 {{ version.split(".")[1:] | join(".") }}'
  delegate_to: localhost

我的档案

build_version: 1.1.1.1
tests:
  hello_1: smith
  hello_2: john
  hello_3: justin
  test_tree_1: card
versions:
  version_1: 6.2.1
  version_2: 6.0.0
  version_3: 6.0.2
  test_tree_1: 0.1.0.i1

在这里test_tree_1只会替换版本之后:
注解版本是一个可分析变量

相关问题