繁体   English   中英

如何在 ansible 剧本中将目标服务器将运行任务的主机名字符串定义为变量?

[英]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 文件。

下面是我的剧本。

有没有办法定义以下变量

  • 值_A
  • 值_B
  • 服务器_目标
  • csv_文件名
  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM