Руководство по 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–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/scenario_guides/guide_gce.html