我对ansible非常陌生,我希望在我的工作中实现以下目标:
作为应用程序常规部署的一部分,我们有一个sql script(用于警告表、添加表等),它需要在一个区域中的3个模式上运行,在另一个区域中运行5个模式。应用程序在aws中,数据库是arora db(RDS)。我的问题是,我不知道如何将其参数化,使其在每个模式上运行,首先是一个接一个,然后可以升级到并行运行。
我在一本剧本里做了以下几件事:
- hosts: localhost
vars:
script_file: "{{ path }}"
tasks:
- name: rds_manage_user - run .sql script to alert and create new tables
shell: "mysql -h {{ item.host }} -u {{ item.user }} -p{{ item.password }} < {{ script_file }} >> /usr/local/testscript.log"
with_items:
- { host: testhost1.com, user: testuser1, password: "testpass1" }
- { host: testhost2.com, user: testuser2, password: "testpass2" }这是可行的,我得到了想要的输出。但是如何从外部文件传递这些hostname、用户和密码,它可以在文件中运行并在所有schemas中执行脚本。
谢谢你,拉维。它确实起了作用:)我几乎没有后续问题,因为我试图迭代地改进这个脚本。
如何使用mysql_db模块实现相同的功能。甚至包括上述两个关于并行运行和允许脚本长时间运行的问题。在尝试使用my_sqldb模块时,我编写了如下所示:
vars:
login_host: "{{ host }}"
login_user: "{{ user }}"
login_password: "{{ password }}"
login_name: "{{ name }}"
script_file: "{{ path }}"
tasks:
- name: Run SQL commands
mysql_db:
login_host: "{{ login_host }}"
login_password: "{{ login_password }}"
login_user: "{{ login_user }}"
name: "{{login_name }}"
state: import
target: "{{ script_file }}"
register: sql_query_output发布于 2019-11-21 10:09:49
您可以定义变量文件并在其中添加这些细节,并将其传递给您的剧本。
contents of dbdata.yaml
###########
---
conn_details:
- { host: testhost1.com, user: testuser1, password: "testpass1" }
- { host: testhost2.com, user: testuser2, password: "testpass2" }
############在剧本中,请在下面进行更改。剧本内容:
#########
vars:
script_file: "{{ path }}"
vars_files:
- dbdata.yaml
# for above file, you can provide absolute of path of file if it is not kept in current folder
tasks:
- name: rds_manage_user - run .sql script to alert and create new tables
shell: "mysql -h {{ item.host }} -u {{ item.user }} -p{{ item.password }} < {{ script_file }} >> /usr/local/testscript.log"
with_items: "{{ conn_details }}"
##########发布于 2019-11-27 10:17:39
很抱歉迟到了。感谢@Ravi的帮助。我扩展了他提供的上述部分,以便在本地并行执行几个任务。唯一带来的变化是在“不可信的剧本”中。我现将剧本转载如下:
hosts: localhost
vars:
script_file: "{{ path }}"
vars_files:
- dbdata.yml
tasks:
- name: execute sql script
shell: "mysql -h {{ item.host }} -u {{ item.user }} -p{{ item.password }} < {{ script_file }} >> /usr/local/testscript.log"
with_items: "{{ conn_details }}"
register: sql_query_output
async: 600
poll: 0
- name: Wait for creation to finish
async_status:
jid: "{{ item.ansible_job_id }}"
register: _jobs
until: _jobs.finished
delay: 5 # Check every 5 seconds. Adjust as you like.
retries: 10
with_items: "{{ sql_query_output.results }}"希望这能有所帮助。
https://stackoverflow.com/questions/58967141
复制相似问题