Ansible:从另一个数据库的最后一个快照创建新的 RDS 数据库

Ansible: Create new RDS DB from last snapshot of another DB

提升命令似乎不适用于我正在使用的 Ansible 版本。 因此,我正在尝试创建一个新数据库作为现有数据库的副本,并在使其成为主数据库后,删除源数据库。

我试着这样做:

  1. 复制
  2. 提升副本
  3. 删除源数据库

但是现在我在想这个:

  1. 从源数据库上次快照创建新数据库[从头开始作为主数据库]
  2. 删除源数据库

该剧本将如何进行?

我的剧本:

 - hosts: localhost
   vars:
     source_db_name: "{{ SOURCE_DB }}" # stagingdb
     new_db_name: "{{ NEW_DB  }}" # stagingdb2
   tasks:
   - name: Make RDS replica
     local_action:
       module: rds
       region: us-east-1
       command: replicate
       instance_name  : "{{ new_db_name  }}"
       source_instance: "{{ source_db_name  }}"
       wait: yes
       wait_timeout: 900 # wait 15 minutes

# Notice - not working [Ansible bug]
   - name: Promote RDS replica
     local_action:
       module: rds
       region: us-east-1
       command: promote
       instance_name: "{{ new_db_name }}" # stagingdb2
       backup_retention: 0
       wait: yes
       wait_timeout: 300

   - name: Delete source db
     local_action:
       command: delete
       instance_name: "{{ source_db_name }}"
       region: us-east-1

你只需要在RDS module中使用restore命令即可。

您的剧本将如下所示:

 - hosts: localhost
   connection: local
   gather_facts: yes
   vars:
     date: "{{ ansible_date_time.year }}-{{ ansible_date_time.month }}-{{ ansible_date_time.day }}-{{ ansible_date_time.hour }}-{{ ansible_date_time.minute }}"
     source_db_name: "{{ SOURCE_DB }}" # stagingdb
     new_db_name: "{{ NEW_DB  }}" # stagingdb2
     snapshot_name: "snapshot-{{ source_db_name }}--{{ date }}"
   tasks:
   - name : Take RDS snapshot
     rds  :
       command       : snapshot
       instance_name : "{{ source_db_name }}"
       snapshot      : "{{ snapshot_name }}"
       wait          : yes
     register: snapshot_out

    - name : get facts
      rds  :
        command       : facts
        instance_name : "{{ instance_name }}"
      register: db_facts

   - name : Restore RDS from snapshot
     rds  :
        command           : restore
        instance_name     : "{{ new_db_name }}"
        snapshot          : "{{ snapshot_name }}"
        instance_type     : "{{ db_facts.instance.instance_type }}"
        subnet            : primary # Unfortunately this isn't returned by db_facts
        wait              : yes
        wait_timeout      : 1200

   - name : Delete source db
     rds  :
        command       : delete
        instance_name : "{{ source_db_name }}"

里面还有一些额外的技巧:

  • 我在游戏开始时将 connection 设置为 local 因此,当与 hosts: localhost 结合使用时,所有任务都将是本地任务。
  • 我根据 Ansible 主机自己的事实(来自 gather_facts 并且它只针对本地主机)构建了一个看起来像 YYYY-mm-dd-hh-mm 的日期时间戳。然后将其用于快照名称以确保我们创建它(如果存在同名快照,则 Ansible 不会创建另一个快照 - 在这种情况下这可能很糟糕,因为它会在删除您的快照之前使用旧快照源数据库)。
  • 我在任务中获取有关 RDS 实例的事实,并使用它来将实例类型设置为与源数据库相同。如果你不想那样,那么你可以直接定义 instance_type 并删除整个 get facts 任务