[英]How to define as variables the strings of hostname of target-server-which-will-run-the-tasks in ansible playbook?
我写了一个 ansible 剧本,
它被命名为main.yml
,放置在路径/my_path/ansible-venv/bin/ansible-playbook playbooks/generate_results/
。
我想通过传递一些参数从 bash shell 激活它,如下所示
/my_path/ansible-venv/bin/ansible-playbook playbooks/generate_results/main.yml --extra-vars="field_A=$value_A field_B=$value_B"
这些参数应定义运行 playbook 任务的主机。
该剧本旨在对寻址主机上的数据库运行查询,以生成包含查询结果的 csv 文件。
下面是我的剧本。
有没有办法定义以下变量
在需要它们的任务运行之前?
我把它们放在关键的vars:
下,但这是错误的
我该怎么做?
注意:数据库访问凭证保存在另一个 ansible 文件中
---
vars:
# inputs
#--------
# these variables will be overwritten as extra variables by the bash calling this ansible playbook
value_A: 0 # cannot be left void
value_B: 0 # cannot be left void
# fixed variables
# ----------------------
remote_machine_filepath: '/tmp/'
# input processing
#----------------------
server_target: "{{ 'server-' + value_A.zfill(3) + '_B'+value_B }}"
# generated variables
# ----------------------
csv_filename: "results_{{ value_A }}{{ value_B }}.csv"
copy_query: "\copy (select * from my_table where field_A={{ value_A }} and field_B={{ value_B }}) to '{{ remote_machine_filepath }}{{ csv_filename }}' with delimiter ';' CSV HEADER;"
- hosts:
- {{ server_target }}
order: sorted
gather_facts: False
tasks:
- name: generate csv
ansible.builtin.shell:
cmd: psql -h '{{ db_host }}' -U '{{ db_username }}' -d '{{ db_database }}' -p '{{ db_database_port }}' -tAc "{{ copy_query }}"
register: psql_output # this will be like: COPY X
ignore_errors: true
no_log: true
解决了
给整个vars
块一个 +1 缩进并在块开始的地方添加一个 - 就足够了(我在块中添加了一个name
关键字)以使其工作(与hosts
相同的缩进级别)
---
- name: my_playbook
vars:
# inputs
#--------
# these variables will be overwritten as extra variables by the bash calling this ansible playbook
value_A: 0 # cannot be left void
value_B: 0 # cannot be left void
# fixed variables
# ----------------------
remote_machine_filepath: '/tmp/'
# input processing
#----------------------
server_target: "{{ 'server-' + value_A.zfill(3) + '_B'+value_B }}"
# generated variables
# ----------------------
csv_filename: "results_{{ value_A }}{{ value_B }}.csv"
copy_query: "\copy (select * from my_table where field_A={{ value_A }} and field_B={{ value_B }}) to '{{ remote_machine_filepath }}{{ csv_filename }}' with delimiter ';' CSV HEADER;"
- hosts:
- {{ server_target }}
order: sorted
gather_facts: False
tasks:
- name: generate csv
ansible.builtin.shell:
cmd: psql -h '{{ db_host }}' -U '{{ db_username }}' -d '{{ db_database }}' -p '{{ db_database_port }}' -tAc "{{ copy_query }}"
register: psql_output # this will be like: COPY X
ignore_errors: true
no_log: true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.