首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:在rds中的多个数据库中执行sql脚本

Ansible:在rds中的多个数据库中执行sql脚本
EN

Stack Overflow用户
提问于 2019-11-21 04:04:15
回答 2查看 3.4K关注 0票数 0

我对ansible非常陌生,我希望在我的工作中实现以下目标:

作为应用程序常规部署的一部分,我们有一个sql script(用于警告表、添加表等),它需要在一个区域中的3个模式上运行,在另一个区域中运行5个模式。应用程序在aws中,数据库是arora db(RDS)。我的问题是,我不知道如何将其参数化,使其在每个模式上运行,首先是一个接一个,然后可以升级到并行运行。

我在一本剧本里做了以下几件事:

代码语言:javascript
复制
- 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中执行脚本。

谢谢你,拉维。它确实起了作用:)我几乎没有后续问题,因为我试图迭代地改进这个脚本。

  1. 可以使这两个迭代并行运行。在我的例子中,这是非常重要的,因为我们的sql部署脚本确实运行了相当长的时间。如果sql脚本运行3-4个小时,因为这可能涉及到一些更新,那么修改现有的模式,它有>100 k记录,那么它会失败还是会等待它完成,然后移动

如何使用mysql_db模块实现相同的功能。甚至包括上述两个关于并行运行和允许脚本长时间运行的问题。在尝试使用my_sqldb模块时,我编写了如下所示:

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-21 10:09:49

您可以定义变量文件并在其中添加这些细节,并将其传递给您的剧本。

代码语言:javascript
复制
contents of dbdata.yaml 
###########
---

conn_details:
    - { host: testhost1.com, user: testuser1, password: "testpass1" }
    - { host: testhost2.com, user: testuser2, password: "testpass2" }
############

在剧本中,请在下面进行更改。剧本内容:

代码语言:javascript
复制
#########
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 }}"
##########
票数 0
EN

Stack Overflow用户

发布于 2019-11-27 10:17:39

很抱歉迟到了。感谢@Ravi的帮助。我扩展了他提供的上述部分,以便在本地并行执行几个任务。唯一带来的变化是在“不可信的剧本”中。我现将剧本转载如下:

代码语言:javascript
复制
 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 }}"

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58967141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档