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

时间:2019-11-21 04:04:15

标签: ansible

我对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中执行脚本。

感谢吨拉维。它确实有效:)我几乎没有后续问题,因为我正在尝试迭代改进此脚本。

  1. 我们可以使这两个迭代并行运行吗?就我而言,这非常重要,因为我们的sql部署脚本会运行相当长的时间。
  2. 如果sql脚本运行了3-4个小时(例如可能需要进行一些更新),请修改现有的架构,该架构具有> 100k条记录,那么它会失败还是会等待其完成然后移动

我们如何使用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

2 个答案:

答案 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 }}"

希望这会有所帮助。