我正在使用替换模块来替换 Ansible 中的整行。该行包含双引号和单引号。我尝试添加“\\”来转义它们,但似乎不起作用。有人可以帮助我正确的语法吗?文件中的实际行默认设置为
<!-- <param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='' options='-c client_min_messages=NOTICE'" /> -->
我需要取消注释并用 Postgres DB-info 变量替换 db 部分。
- name: "Update switch.conf.xml with Postgres DB info"
replace:
path: /etc/freeswitch/autoload_configs/switch.conf.xml
regexp: '^<!-- <param name="core-db-dsn" value="pgsql: .*$'
line: "<param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname={{ DB-Info }} user={{ DB-Info
}} password='{{ DB-Pass }}' options='-c client_min_messages=NOTICE'" />"
答案1
还有更多选择。为了避免转义复杂的表达式,请将它们放入文件中。例如,将正则表达式和行放入 (r*,l*) 文件集中
shell> cat files/replace/r1
^<!-- <param name="core-db-dsn" value="pgsql:(.*)$
shell> cat files/replace/l1
<param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname={{ DB_Info }} user={{ DB_Info }} password='{{ DB_Pass }}' options='-c client_min_messages=NOTICE'" />
然后下面的任务就完成了
- replace:
path: switch.conf.xml
regexp: "{{ lookup('file', 'files/replace/r1') }}"
replace: "{{ lookup('template', 'files/replace/l1') }}"
vars:
DB_Info: freeswitch2
DB_Pass: passwd
如果有更多文件,则循环运行该任务。例如
- replace:
path: switch.conf.xml
regexp: "{{ lookup('file', 'files/replace/r' ~ ansible_loop.index ) }}"
replace: "{{ lookup('template', 'files/replace/l' ~ ansible_loop.index) }}"
loop: "{{ lookup('fileglob', 'files/replace/r*', wantlist=True) }}"
loop_control:
extended: true
vars:
DB_Info: freeswitch2
DB_Pass: passwd
确保“glob”仅匹配您想要的内容。删除所有临时文件或备份文件。该循环需要一组 (r*,l*) 文件,其连续索引从 1 开始。
为了避免维护太多 (r*,l*) 文件,请将所有正则表达式和行放入单个文件中并循环文件的行。例如
- replace:
path: switch.conf.xml
regexp: "{{ item.0 }}"
replace: "{{ item.1 }}"
with_together:
- "{{ lookup('file', 'files/replace/r-all').splitlines() }}"
- "{{ lookup('template', 'files/replace/l-all').splitlines() }}"
loop_control:
label: "{{ item.0 }}"
vars:
DB_Info: freeswitch2
DB_Pass: passwd