在我的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模板,以便将该变量传递给查询?
2条答案
按热度按时间nr7wwzry1#
在Ansible中,您不向模板传递变量-模板可以访问当前范围内的所有变量。换句话说,您只需要确保您已经获得了
target_date.yml
文件。例如,我们在这里使用include_vars
模块:我们还可以在vars文件中读取:
ansible-playbook
命令行上的-e
选项:vars_files
选项:group_vars
或host_vars
目录的适当文件中设置input_date
变量。等等。
请注意,为了使您的剧本工作,您需要在查询模板中删除
;
。使用分号结束时,复制任务将失败:9ceoxa922#
正如@β.εηο ιτ.βε所建议的,用jinja 2“表达式tags"x 1 m0n1x替换jinja 2模板中日期的硬编码值就足够了。
另外,如@larsks所示,jinja 2模板中的查询不能以列(
;
)结束