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\"]"'
我喜欢搜索和替换字符串,如果我使用正则表达式搜索/替换,这会让我逃避分配:
在 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\"]"'