ansible 2.7.8
我的目标是:
根据另一个数据库的最新快照创建一个新的RDS数据库。
我在(Ansible:从另一个DB的最后一个快照创建新的RDS DB)上发现了一个类似的问题,但是这个解决方案需要创建一个新的快照。我想从最近创建的快照中恢复。
这就是我到目前为止所做的..。用于收集当前快照信息的剧本。我正在使用rds_snapshot_facts模块(module.html)
- name : get snap facts
rds_snapshot_facts :
db_instance_identifier: "{{ source_db_name }}"
region : "{{ region }}"
aws_access_key: "{{ access_key }}"
aws_secret_key: "{{ secret_key }}"它成功运行,下面是从上面的播放返回的示例数据结构:
"snapshots": [
{
"allocated_storage": 500,
"availability_zone": "us-east-1a",
"db_instance_identifier": "pg-test-01",
"db_snapshot_arn": "arn:aws:rds:us-east-1:111111111111111:snapshot:rds:pg-test-01-2019-03-01-06-22",
"db_snapshot_identifier": "rds:pg-test-01-2019-03-01-06-22",
"dbi_resource_id": "db-hidden",
"encrypted": false,
"engine": "postgres",
"engine_version": "10.6",
"iam_database_authentication_enabled": false,
"instance_create_time": "2019-02-27T05:08:47.480000+00:00",
"license_model": "postgresql-license",
"master_username": "postgres",
"option_group_name": "default:postgres-10",
"percent_progress": 100,
"port": 5432,
"processor_features": [],
"snapshot_create_time": "2019-03-01T06:22:58.771000+00:00",
"snapshot_type": "automated",
"status": "available",
"storage_type": "gp2",
"tags": {},
"vpc_id": "vpc-hidden"
},
{
"allocated_storage": 500,
"availability_zone": "us-east-1a",
"db_instance_identifier": "pg-test-01",
"db_snapshot_arn": "arn:aws:rds:us-east-1:111111111111111:snapshot:rds:pg-test-01-2019-03-02-06-32",
"db_snapshot_identifier": "rds:pg-test-01-2019-03-02-06-32",
"dbi_resource_id": "db-hidden",
"encrypted": false,
"engine": "postgres",
"engine_version": "10.6",
"iam_database_authentication_enabled": false,
"instance_create_time": "2019-02-27T05:08:47.480000+00:00",
"license_model": "postgresql-license",
"master_username": "postgres",
"option_group_name": "default:postgres-10",
"percent_progress": 100,
"port": 5432,
"processor_features": [],
"snapshot_create_time": "2019-03-02T06:32:42.325000+00:00",
"snapshot_type": "automated",
"status": "available",
"storage_type": "gp2",
"tags": {},
"vpc_id": "vpc-hidden"
},
{
"allocated_storage": 500,
"availability_zone": "us-east-1a",
"db_instance_identifier": "pg-test-01",
"db_snapshot_arn": "arn:aws:rds:us-east-1:111111111111111:snapshot:rds:pg-test-01-2019-03-03-06-33",
"db_snapshot_identifier": "rds:pg-test-01-2019-03-03-06-33",
"dbi_resource_id": "db-hidden",
"encrypted": false,
"engine": "postgres",
"engine_version": "10.6",
"iam_database_authentication_enabled": false,
"instance_create_time": "2019-02-27T05:08:47.480000+00:00",
"license_model": "postgresql-license",
"master_username": "postgres",
"option_group_name": "default:postgres-10",
"percent_progress": 100,
"port": 5432,
"processor_features": [],
"snapshot_create_time": "2019-03-03T06:33:06.463000+00:00",
"snapshot_type": "automated",
"status": "available",
"storage_type": "gp2",
"tags": {},
"vpc_id": "vpc-hidden"
},
{
"allocated_storage": 500,
"availability_zone": "us-east-1a",
"db_instance_identifier": "pg-test-01",
"db_snapshot_arn": "arn:aws:rds:us-east-1:111111111111111:snapshot:rds:pg-test-01-2019-03-04-06-32",
"db_snapshot_identifier": "rds:pg-test-01-2019-03-04-06-32",
"dbi_resource_id": "db-hidden",
"encrypted": false,
"engine": "postgres",
"engine_version": "10.6",
"iam_database_authentication_enabled": false,
"instance_create_time": "2019-02-27T05:08:47.480000+00:00",
"license_model": "postgresql-license",
"master_username": "postgres",
"option_group_name": "default:postgres-10",
"percent_progress": 100,
"port": 5432,
"processor_features": [],
"snapshot_create_time": "2019-03-04T06:32:30.227000+00:00",
"snapshot_type": "automated",
"status": "available",
"storage_type": "gp2",
"tags": {},
"vpc_id": "vpc-hidden"
},
{
"allocated_storage": 500,
"availability_zone": "us-east-1a",
"db_instance_identifier": "pg-test-01",
"db_snapshot_arn": "arn:aws:rds:us-east-1:111111111111111:snapshot:rds:pg-test-01-2019-03-05-06-32",
"db_snapshot_identifier": "rds:pg-test-01-2019-03-05-06-32",
"dbi_resource_id": "db-hidden",
"encrypted": false,
"engine": "postgres",
"engine_version": "10.6",
"iam_database_authentication_enabled": false,
"instance_create_time": "2019-02-27T05:08:47.480000+00:00",
"license_model": "postgresql-license",
"master_username": "postgres",
"option_group_name": "default:postgres-10",
"percent_progress": 100,
"port": 5432,
"processor_features": [],
"snapshot_create_time": "2019-03-05T06:32:57.880000+00:00",
"snapshot_type": "automated",
"status": "available",
"storage_type": "gp2",
"tags": {},
"vpc_id": "vpc-hidden"
},
{
"allocated_storage": 500,
"availability_zone": "us-east-1a",
"db_instance_identifier": "pg-test-01",
"db_snapshot_arn": "arn:aws:rds:us-east-1:111111111111111:snapshot:snapshot-pg-test-01-2019-03-06-02-22",
"db_snapshot_identifier": "snapshot-pg-test-01-2019-03-06-02-22",
"dbi_resource_id": "db-hidden",
"encrypted": false,
"engine": "postgres",
"engine_version": "10.6",
"iam_database_authentication_enabled": false,
"instance_create_time": "2019-02-27T05:08:47.480000+00:00",
"license_model": "postgresql-license",
"master_username": "postgres",
"option_group_name": "default:postgres-10",
"percent_progress": 100,
"port": 5432,
"processor_features": [],
"snapshot_create_time": "2019-03-06T02:23:35.039000+00:00",
"snapshot_type": "manual",
"status": "available",
"storage_type": "gp2",
"tags": {},
"vpc_id": "vpc-hidden"
}
]因此,有了上面的信息,我想对它做一些逻辑,并创建一个新的数据库。
我已经知道如何从快照创建数据库:
- name : Restore RDS from snapshot
rds :
command : restore
instance_name : "{{ new_db_name }}"
snapshot : "{{ snapshot_name }}"
instance_type : "db.t2.medium"
subnet : my_subnet_grp
wait : yes
wait_timeout : 1600
region : "{{ region }}"
aws_access_key: "{{ access_key }}"
aws_secret_key: "{{ secret_key }}"但是,在我的例子中,我希望动态地从收集到的事实中填充变量"{{ snapshot_name }}"。
从本质上讲,伪代码逻辑应该是这样的:
db_snapshot_identifier where status=available and max(snapshot_create_time)我真的不知道从哪里开始为Ansible操作构建逻辑,所以欢迎任何帮助或指向正确方向的方向--谢谢!
发布于 2019-03-06 11:49:38
Jinja2是你所需要的。
使用selectattr筛选器只能选择可用的快照。
然后sort过滤器对结果进行snapshot_create_time排序
最后,last过滤器选择最后的结果并在rds模块中使用。
在Jinja2文档中有很多好的信息
- name : get snap facts
rds_snapshot_facts :
db_instance_identifier: "{{ source_db_name }}"
region : "{{ region }}"
aws_access_key: "{{ access_key }}"
aws_secret_key: "{{ secret_key }}"
register: snapshot_facts
- name: get latest snapshot facts
set_fact:
latest_snapshot: '{{ snapshot_facts.snapshots |
selectattr("status", "equalto", "available") |
sort(attribute="snapshot_create_time") |
last }}'
- name : Restore RDS from snapshot
rds :
command : restore
instance_name : "{{ new_db_name }}"
snapshot : "{{ latest_snapshot.db_snapshot_identifier }}"
instance_type : "db.t2.medium"
subnet : my_subnet_grp
wait : yes
wait_timeout : 1600
region : "{{ region }}"
aws_access_key: "{{ access_key }}"
aws_secret_key: "{{ secret_key }}"https://stackoverflow.com/questions/55014967
复制相似问题