[英]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.