如何在Jinja2模板的SQL查询中使用Ansible变量实现值替换?
问题描述
我在使用Ansible的community.postgresql.postgresql_copy模块执行Jinja2模板中的SQL查询,现有Playbook如下:
- hosts: "{{ hosts_list }}" gather_facts: no vars_files: - vars/main.yml - vars/my_hosts.yml - vars/target_date.yml tasks: - name: generate report community.postgresql.postgresql_copy: login_host: '{{ db_host }}' login_user: '{{ db_username }}' login_password: '{{ db_password }}' db: '{{ db_database }}' port: '{{ db_database_port }}' src: "{{ lookup('template', 'my_report_query.sql.j2') }}" copy_to: /tmp/my_report.csv options: format: csv delimiter: ';' header: yes
当前SQL模板my_report_query.sql.j2内容为固定日期:
select * from mytable where date='2023-02-03';
已在playbooks/my_playbook/vars/target_date.yml中定义变量:
input_date: "2023-05-03"
需要将该变量值传入SQL查询实现动态替换,请问如何修改Playbook和Jinja2模板?
解决方案
1. 修改Jinja2 SQL模板
直接在my_report_query.sql.j2中使用Ansible变量替换固定日期,保留SQL语法要求的单引号即可:
select * from mytable where date='{{ input_date }}';
2. Playbook无需修改
你的Playbook已经通过vars_files加载了target_date.yml,变量input_date会被Ansible自动识别并传递给Jinja2模板,因此现有Playbook不需要做任何调整。
执行效果
当Playbook运行时,lookup('template')会渲染Jinja2模板,将{{ input_date }}替换为定义的2023-05-03,最终执行的SQL语句为:
select * from mytable where date='2023-05-03';
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

