postgresql 如何在保存在jinja2模板中的SQL查询中定义变量,并在ansible运行查询时将其替换为值?

klh5stk1  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(154)

在我的Ansible剧本中,有一个任务在我的数据库上运行保存在Jinja2模板中的SQL查询。

- 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

查询类似于:

select * from mytable where date='2023-02-03';

现在,我想向查询传递一个在我的Ansible playbook中定义的日期值。
所以,在这种情况下,在我的Ansible剧本中定义了一个变量

input_date: "2023-05-03"

保存在文件playbooks/my_playbook/vars/target_date.yml
我如何编辑我的playbook和Jinja2模板,以便将该变量传递给查询?

nr7wwzry

nr7wwzry1#

在Ansible中,您不向模板传递变量-模板可以访问当前范围内的所有变量。换句话说,您只需要确保您已经获得了target_date.yml文件。例如,我们在这里使用include_vars模块:

- hosts: localhost
  gather_facts: false
  vars:
    db_host: localhost
    db_username: example_user
    db_password: example_pass
    db_database: example_db
  tasks:
  - name: read vars file
    include_vars:
      file: vars/target_date.yml

  - 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|default(5432) }}'
      src: "{{ lookup('template', 'my_report_query.j2.sql') }}"
      copy_to: /tmp/my_report.csv
      options:
        format: csv
        delimiter: ';'
        header: yes

我们还可以在vars文件中读取:

  • 使用ansible-playbook命令行上的-e选项:
ansible-playbook playbook.yaml -e @vars/target_date.yaml
  • 通过在游戏中使用vars_files选项:
- hosts: localhost
  vars_files:
  - vars/target_date.yml
  • 通过在group_varshost_vars目录的适当文件中设置input_date变量。

等等。
请注意,为了使您的剧本工作,您需要在查询模板中删除;。使用分号结束时,复制任务将失败:

Cannot execute SQL 'COPY (select * from mytable where date='2023-05-03';
) TO '/tmp/my_report.csv' (format csv, delimiter ';', header True)': syntax error at or near ";"
LINE 1: COPY (select * from mytable where date='2023-05-03';
                                                           ^
9ceoxa92

9ceoxa922#

正如@β.εηο ιτ.βε所建议的,用jinja 2“表达式tags"x 1 m0n1x替换jinja 2模板中日期的硬编码值就足够了。

select * from mytable where date='{{ input_date }}'

另外,如@larsks所示,jinja 2模板中的查询不能以列(;)结束

相关问题