Ansible search and replace without regex only string literals 避免转义

Ansible search and replace without regex only string literals to avoid escaping

我喜欢搜索和替换字符串,如果我使用正则表达式搜索/替换,这会让我逃避分配:

在 mystuff.txt 中(关于 blah blah 很抱歉,但是分配了个人文本)我有分配的字符串,但我喜欢搜索和替换那些:

Blah Blah ${DBNname.db_name} Blah Blah 
Blah Blah ${DBNname.db_name} Blah Blah 
Blah Blah ${DBName.ip}

在 ansible 剧本中我有这个:

- name: search 
  replace:
    path: "foo/mystuff.txt"
    regexp: "{{ item.split('|')[0] }}"
    replace: "{{ item.split('|')[1] }}"
  with_items: "{{ config_list }}"

并在命令行中传递:

config_list =['\${DBNname\\.db_name}|MySql','\${DBName\\.ip}|127.0.0.1']

这工作正常。

如你所见,我有很多转义正在进行,我想避免它,因为参数可能很长。

是否需要在命令行中传递 config_list 变量?因为如果你把它放在一个文件中,转义就会简单得多。例如,如果我将以下内容放在 config_list.yml 中:

config_list:
  - search: '${DBNname\.db_name}'
    replace: 'MySql'
  - search: '${DBNname\.ip}'
    replace: '127.0.0.1'

我可以运行这个剧本:

- hosts: localhost
  gather_facts: false
  tasks:
    - replace:
        path: mystuff.txt
        regexp: '{{ item.search }}'
        replace: '{{ item.replace }}'
      loop: '{{ config_list }}'

像这样:

ansible-playbook playbook.yml -e @config_list.yml

它改变了这个:

${DBNname.db_name}
${DBNname.ip}

进入:

MySql
127.0.0.1

如果你真的需要使用你问题中显示的格式在命令行上传递参数,这似乎 上班:

$ ansible-playbook playbook.yml -e '{"config_list": ["\${DBNname\.db_name}|MySql", "\${DBNname\.ip}|127.0.0.1"]}'

如果你这样写剧本:

- hosts: localhost
  gather_facts: false
  tasks:
    - replace:
        path: mystuff.txt
        regexp: '{{ x.0 }}'
        replace: '{{ x.1 }}'
      vars:
        x: "{{ item.split('|') }}"
      loop: '{{ config_list }}'

以上剧本也适用于此输入:

ansible-playbook playbook.yml -e 'config_list="[\"\${DBNname\.db_name}|MySql\", \"\${DBNname\.ip}|127.0.0.1\"]"'