我对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
答案 0 :(得分:0)
您可以定义变量文件并在其中添加这些详细信息,然后将其传递给您的剧本。
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 }}"
##########
答案 1 :(得分:0)
对不起,我的帖子很晚。感谢@Ravi的帮助。我扩展了他提供的上述内容,以便在localhost中并行执行一些任务。 Ansible手册中仅介绍了更改。我正在按如下方式复制剧本:
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 }}"
希望这会有所帮助。