Ansible:从另一个数据库的最后一个快照创建新的 RDS 数据库
Ansible: Create new RDS DB from last snapshot of another DB
提升命令似乎不适用于我正在使用的 Ansible 版本。
因此,我正在尝试创建一个新数据库作为现有数据库的副本,并在使其成为主数据库后,删除源数据库。
我试着这样做:
- 复制
- 提升副本
- 删除源数据库
但是现在我在想这个:
- 从源数据库上次快照创建新数据库[从头开始作为主数据库]
- 删除源数据库
该剧本将如何进行?
我的剧本:
- 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
任务
提升命令似乎不适用于我正在使用的 Ansible 版本。 因此,我正在尝试创建一个新数据库作为现有数据库的副本,并在使其成为主数据库后,删除源数据库。
我试着这样做:
- 复制
- 提升副本
- 删除源数据库
但是现在我在想这个:
- 从源数据库上次快照创建新数据库[从头开始作为主数据库]
- 删除源数据库
该剧本将如何进行?
我的剧本:
- 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
任务