Руководство по 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 network
gcp_compute_network:
name: 'network-instance'
project: "{{ gcp_project }}"
auth_kind: "{{ gcp_cred_kind }}"
service_account_file: "{{ gcp_cred_file }}"
scopes:
- https://www.googleapis.com/auth/compute
state: present
register: network
- 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: "{{ network }}"
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
sudo: 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-адрес с помощью gcp_compute_address и разместить имя/выход здесь. Вы также можете поместить строковое значение имени IP-адреса GCP или фактический 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
with_items:
- 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.9/scenario_guides/guide_gce.html