Руководство по Google Cloud Platform
Введение
Ansible и Google совместно разработали набор автоматически генерируемых модулей Ansible, призванных охватить все аспекты Google Cloud Platform (GCP) последовательно и полно.
Ansible содержит модули для управления ресурсами Google Cloud Platform, включая создание виртуальных машин, контроль сетевого доступа, работу с постоянными дисками, управление балансировщиками нагрузки и многое другое.
Эти новые модули можно найти под новой согласованной схемой имён «gcp_*» (Примечание: модули gcp_target_proxy и gcp_url_map являются устаревшими, несмотря на имя «gcp_*». Пожалуйста, используйте gcp_compute_target_proxy и gcp_compute_url_map вместо них).
Кроме того, плагин инвентаризации gcp_compute может обнаруживать все виртуальные машины Google Compute Engine (GCE) и автоматически добавлять их в вашу инвентаризацию Ansible.
Вы можете найти и другие модули GCP, которые не соответствуют этой схеме именования. Это оригинальные модули, разработанные в первую очередь сообществом Ansible. Некоторые функции перекрываются, например, модулем «gce» и новым модулем «gcp_compute_instance». Можно использовать любой из них, но при попытке их совместного использования могут возникнуть проблемы.
Хотя модули GCP сообщества не будут удалены, Google активно работает над новыми модулями «gcp_*». Google стремится обеспечить сообществу Ansible отличный опыт работы с GCP и поэтому рекомендует, по возможности, использовать эти новые модули.
Требования
Модули GCP требуют установки как requests , так и google-auth библиотек.
$ pip install requests google-auth
В качестве альтернативы для RHEL/CentOS также доступен пакет python-requests, удовлетворяющий требованиям requests библиотек.
$ yum install python-requests
Учётные данные
Создание учётной записи GCP с учётными данными для Ansible очень просто. У вас есть несколько вариантов получения учётных данных — вот два наиболее распространённых варианта:
- Учётные записи сервисов (рекомендуется): Используйте JSON-учётные записи сервисов со специфическими разрешениями.
- Учётные записи машины: Используйте разрешения, связанные с виртуальной машиной GCP, на которой вы используете Ansible.
В следующих примерах мы будем использовать учётные данные учётной записи сервиса.
Для работы с модулями GCP сначала необходимо получить учётные данные в формате JSON:
После получения учётных данных есть два способа предоставить их Ansible:
- указанием их непосредственно в качестве параметров модуля
- установкой переменных окружения
Предоставление учётных данных как параметров модуля
Для модулей GCE вы можете указать учётные данные как аргументы:
-
auth_kind: тип используемой аутентификации (варианты: machineaccount, serviceaccount, application) -
service_account_email: электронный адрес, связанный с проектом -
service_account_file: путь к файлу JSON-учётных данных -
project: идентификатор проекта -
scopes: конкретные разрешения, которые должны использоваться действиями.
Например, чтобы создать новый IP-адрес с помощью модуля gcp_compute_address, можно использовать следующую конфигурацию:
- name: Create IP address
hosts: localhost
gather_facts: no
vars:
service_account_file: /home/my_account.json
project: my-project
auth_kind: serviceaccount
scopes:
- https://www.googleapis.com/auth/compute
tasks:
- name: Allocate an IP Address
gcp_compute_address:
state: present
name: 'test-address1'
region: 'us-west1'
project: "{{ project }}"
auth_kind: "{{ auth_kind }}"
service_account_file: "{{ service_account_file }}"
scopes: "{{ scopes }}"
Предоставление учётных данных как переменных окружения
Установите следующие переменные окружения перед запуском Ansible для настройки ваших учётных данных:
GCP_AUTH_KIND GCP_SERVICE_ACCOUNT_EMAIL GCP_SERVICE_ACCOUNT_FILE GCP_SCOPES
Динамическая инвентаризация GCE
Лучший способ взаимодействия с хостами — использование плагина инвентаризации gcp_compute, который динамически запрашивает GCE и сообщает Ansible, какие узлы можно управлять.
Для использования этого плагина динамической инвентаризации GCE необходимо сначала его включить, указав следующее в файле ansible.cfg:
[inventory] enable_plugins = gcp_compute
Затем создайте файл, который заканчивается на .gcp.yml в корневой директории.
Сценарий инвентаризации gcp_compute принимает те же данные аутентификации, что и любой модуль.
Вот пример допустимого файла инвентаризации:
plugin: gcp_compute projects: - graphite-playground auth_kind: serviceaccount service_account_file: /home/alexstephen/my_account.json
Выполнение ansible-inventory --list -i <filename>.gcp.yml создаст список виртуальных машин GCP, готовых к настройке с помощью Ansible.
Создание виртуальной машины
Полный набор модулей GCP предоставляет возможность создания разнообразных ресурсов GCP с полной поддержкой всего API GCP.
Следующий плейбук создаёт виртуальную машину GCE. Эта виртуальная машина зависит от других ресурсов GCP, таких как Диск. Создавая другие ресурсы отдельно, мы можем указать все необходимые детали о том, как мы хотим настроить другие ресурсы, например, форматирование Диска. Зарегистрировав его в переменной, мы можем просто вставить переменную в задачу виртуальной машины. Модуль gcp_compute_instance рассчитает всё остальное.
- name: Create an instance
hosts: localhost
gather_facts: no
vars:
gcp_project: my-project
gcp_cred_kind: serviceaccount
gcp_cred_file: /home/my_account.json
zone: "us-central1-a"
region: "us-central1"
tasks:
- name: create a disk
gcp_compute_disk:
name: 'disk-instance'
size_gb: 50
source_image: 'projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts'
zone: "{{ zone }}"
project: "{{ gcp_project }}"
auth_kind: "{{ gcp_cred_kind }}"
service_account_file: "{{ gcp_cred_file }}"
scopes:
- https://www.googleapis.com/auth/compute
state: present
register: disk
- name: create a address
gcp_compute_address:
name: 'address-instance'
region: "{{ region }}"
project: "{{ gcp_project }}"
auth_kind: "{{ gcp_cred_kind }}"
service_account_file: "{{ gcp_cred_file }}"
scopes:
- https://www.googleapis.com/auth/compute
state: present
register: address
- name: create a instance
gcp_compute_instance:
state: present
name: test-vm
machine_type: n1-standard-1
disks:
- auto_delete: true
boot: true
source: "{{ disk }}"
network_interfaces:
- network: null # use default
access_configs:
- name: 'External NAT'
nat_ip: "{{ address }}"
type: 'ONE_TO_ONE_NAT'
zone: "{{ zone }}"
project: "{{ gcp_project }}"
auth_kind: "{{ gcp_cred_kind }}"
service_account_file: "{{ gcp_cred_file }}"
scopes:
- https://www.googleapis.com/auth/compute
register: instance
- name: Wait for SSH to come up
wait_for: host={{ address.address }} port=22 delay=10 timeout=60
- name: Add host to groupname
add_host: hostname={{ address.address }} groupname=new_instances
- name: Manage new instances
hosts: new_instances
connection: ssh
become: True
roles:
- base_configuration
- production_server
Обратите внимание, что использование модуля «add_host» выше создаёт временную группу в памяти. Это означает, что плей в том же плейбуке может затем управлять машинами в группе «new_instances», если это необходимо. В данный момент возможна любая произвольная конфигурация.
Дополнительную информацию о Google Cloud можно найти на веб-сайте Google Cloud.
Руководства по миграции
gce.py -> gcp_compute_instance.py
Начиная с Ansible 2.8, мы рекомендуем всем перейти от модуля gce к модулю gcp_compute_instance. Модуль gcp_compute_instance имеет лучшую поддержку всех функций GCP, меньше зависимостей, большую гибкость и лучше поддерживает системы аутентификации GCP.
Модуль gcp_compute_instance поддерживает все функции модуля gce (и многое другое!). Ниже приведена таблица соответствия полей gce к полям gcp_compute_instance.
gce.py | gcp_compute_instance.py | Примечания |
|---|---|---|
state | state/status | Состояние в gce имеет несколько значений: «present», «absent», «stopped», «started», «terminated». Состояние в gcp_compute_instance используется для описания существования виртуальной машины (present) или отсутствия (absent). Статус используется для описания состояния виртуальной машины «started», «stopped» или «terminated». |
image | disks[].initialize_params.source_image | Необходимо создать единственный диск с помощью параметра disks[] и установить его в качестве системного диска (disks[].boot = true) |
image_family | disks[].initialize_params.source_image | См. выше. |
external_projects | disks[].initialize_params.source_image | Имя source_image будет включать имя проекта. |
instance_names | Используйте цикл или несколько задач. | Использование циклов — более ориентированный на Ansible подход к созданию нескольких виртуальных машин, обеспечивающий максимальную гибкость. |
service_account_email | service_accounts[].email | Это электронный адрес учётной записи сервиса, который вы хотите связать с виртуальной машиной. Это не электронный адрес учётной записи сервиса, используемый для учётных данных, необходимых для создания виртуальной машины. |
service_account_permissions | service_accounts[].scopes | Это разрешения, которые вы хотите предоставить виртуальной машине. |
pem_file | Не поддерживается. | Рекомендуется использовать JSON-учётные данные учётной записи сервиса вместо файлов PEM. |
credentials_file | service_account_file | |
project_id | project | |
name | name | Это поле не принимает массив имён. Используйте цикл для создания нескольких виртуальных машин. |
num_instances | Используйте цикл | Для максимальной гибкости мы рекомендуем пользователям использовать возможности Ansible для создания нескольких виртуальных машин вместо того, чтобы позволять модулю делать это за вас. |
network | network_interfaces[].network | |
subnetwork | network_interfaces[].subnetwork | |
persistent_boot_disk | disks[].type = ‘PERSISTENT’ | |
disks | disks[] | |
ip_forward | can_ip_forward | |
external_ip | network_interfaces[].access_configs.nat_ip | Это поле принимает различные типы значений. Вы можете создать IP-адрес с помощью |
disks_auto_delete | disks[].auto_delete | |
preemptible | scheduling.preemptible | |
disk_size | disks[].initialize_params.disk_size_gb |
Пример плейбука приведён ниже:
gcp_compute_instance:
name: "{{ item }}"
machine_type: n1-standard-1
... # any other settings
zone: us-central1-a
project: "my-project"
auth_kind: "service_account_file"
service_account_file: "~/my_account.json"
state: present
loop:
- instance-1
- instance-2
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/scenario_guides/guide_gce.html