Ansible - создание экземпляра RDS из самого последнего существующего снимка - PullRequest
2 голосов
/ 06 марта 2019

Ансибл 2.7.8

Моя цель такова:

Создайте новую базу данных RDS из самого последнего существующего снимка другой базы данных.

Я нашел похожий вопрос в ( Ansible: Создать новую RDS DB из последнего снимка другой БД ), однако для этого решения требовалось создать новый снимок. Я хотел бы восстановить из самого последнего уже созданного снимка.

Итак, вот что я сделал до сих пор ... Игра использовалась для сбора информации о текущем снимке. Я использую модуль rds_snapshot_facts (https://docs.ansible.com/ansible/latest/modules/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, поэтому любая помощь или указание в правильном направлении приветствуется - спасибо!

1 Ответ

1 голос
/ 06 марта 2019

Джинджа2 - это то, что вам нужно.

Используйте фильтр 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 }}"
...