Руководство по Google Cloud Platform
Введение
Примечание
Данный раздел документации находится в стадии разработки. Мы работаем над добавлением больше примеров использования всех модулей GCE и их взаимодействия. Обновления через запросы на изменение в github приветствуются!
Ansible содержит модули для управления ресурсами Google Compute Engine, включая создание виртуальных машин, настройку сетевого доступа, работу с постоянными дисками и управление балансировщиками нагрузки. Кроме того, существует плагин инвентаризации, который может автоматически загрузить все ваши виртуальные машины GCE в динамическую инвентаризацию Ansible и создать группы по тегам и другим свойствам.
Все модули GCE требуют модуля apache-libcloud, который можно установить с помощью pip:
$ pip install apache-libcloud
Примечание
Если вы используете Ansible на Mac OS X, libcloud также должен получить доступ к цепочке сертификатов CA. Вам нужно будет загрузить один (вы можете получить его здесь).
Учетные данные
Для работы с модулями GCE вам сначала нужно получить учетные данные в формате JSON:
Существует три способа предоставления учетных данных Ansible, чтобы он мог взаимодействовать с Google Cloud для действий по развертыванию и настройке:
Примечание
Если вы хотите использовать учетные данные в формате JSON, у вас должен быть libcloud >= 0.17.0
- путем непосредственного предоставления модулям
- путем заполнения файла
secrets.py - путем настройки переменных среды
Вызов модулей путём передачи учетных данных
Для модулей GCE вы можете указать учетные данные в качестве аргументов:
service_account_email: электронный адрес, связанный с проектомcredentials_file: путь к файлу учетных данных в формате JSONproject_id: идентификатор проекта
Например, чтобы создать новую виртуальную машину с помощью модуля cloud, вы можете использовать следующую конфигурацию:
- name: Create instance(s)
hosts: localhost
connection: local
gather_facts: no
vars:
service_account_email: unique-id@developer.gserviceaccount.com
credentials_file: /path/to/project.json
project_id: project-id
machine_type: n1-standard-1
image: debian-7
tasks:
- name: Launch instances
gce:
instance_names: dev
machine_type: "{{ machine_type }}"
image: "{{ image }}"
service_account_email: "{{ service_account_email }}"
credentials_file: "{{ credentials_file }}"
project_id: "{{ project_id }}"
При запуске Ansible внутри виртуальной машины GCE вы можете использовать учетные данные учетной записи службы из локального сервера метаданных, установив как service_account_email, так и credentials_file в пустую строку.
Настройка модулей с помощью secrets.py
Создайте файл secrets.py, похожий на приведенный ниже, и поместите его в папку, которая находится в вашей $PYTHONPATH:
GCE_PARAMS = ('i...@project.googleusercontent.com', '/path/to/project.json')
GCE_KEYWORD_PARAMS = {'project': 'project_id'}
Убедитесь, что вы ввели адрес электронной почты созданной учетной записи службы, а не адрес вашей основной учетной записи.
Теперь модули могут использоваться так же, как и выше, но информация об учетной записи может быть опущена.
Если вы запускаете Ansible изнутри виртуальной машины GCE с авторизованной учетной записью службы, вы можете установить адрес электронной почты и путь к файлу учетных данных следующим образом, чтобы они автоматически подхватывались:
GCE_PARAMS = ('', '')
GCE_KEYWORD_PARAMS = {'project': 'project_id', 'datacenter': ''}
Настройка модулей с помощью переменных среды
Установите следующие переменные среды перед запуском Ansible, чтобы настроить ваши учетные данные:
GCE_EMAIL GCE_PROJECT GCE_CREDENTIALS_FILE_PATH
Динамическая инвентаризация GCE
Лучший способ взаимодействия с узлами — использование плагина инвентаризации gce, который динамически запрашивает GCE и сообщает Ansible, какие узлы могут быть управляемы.
Обратите внимание, что при использовании скрипта инвентаризации gce.py, вам также необходимо заполнить файл gce.ini, который вы можете найти в каталоге contrib/inventory вашей установки ansible.
Чтобы использовать скрипт динамической инвентаризации GCE, скопируйте gce.py из contrib/inventory в свой каталог инвентаризации и сделайте его исполняемым. Вы можете указать учетные данные для gce.py с помощью переменной среды GCE_INI_PATH — по умолчанию ищется gce.ini в той же папке, что и скрипт инвентаризации.
Давайте проверим, работает ли инвентаризация:
$ ./gce.py --list
Вы должны увидеть вывод, описывающий узлы, которые у вас есть, если таковые имеются, работающие в Google Compute Engine.
Теперь давайте посмотрим, можем ли мы использовать скрипт инвентаризации для взаимодействия с Google.
$ GCE_INI_PATH=~/.gce.ini ansible all -i gce.py -m setup
hostname | success >> {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"x.x.x.x"
],
Как и все скрипты динамической инвентаризации в Ansible, вы можете настроить путь к инвентаризации в ansible.cfg. Рекомендуемый способ использования инвентаризации — создать каталог inventory, и поместить в него как скрипт инвентаризации gce.py, так и файл, содержащий localhost. Это позволит использовать инвентаризацию облака совместно с локальной инвентаризацией (например, физического дата-центра) или машин, работающих в разных провайдерах.
Выполнение ansible или ansible-playbook и указание каталога inventory вместо отдельного файла заставит ansible оценить каждый файл в этом каталоге для инвентаризации.
Давайте еще раз воспользуемся нашим скриптом инвентаризации, чтобы проверить, может ли он взаимодействовать с Google Cloud:
$ ansible all -i inventory/ -m setup
hostname | success >> {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"x.x.x.x"
],
Вывод должен быть похожим на предыдущую команду. Если вам нужен менее подробный вывод и вы хотите проверить только подключение SSH, используйте «-m» ping вместо этого.
Сценарии использования
Для следующего сценария использования давайте воспользуемся этим небольшим скриптом оболочки как оберткой.
#!/usr/bin/env bash PLAYBOOK="$1" if [[ -z $PLAYBOOK ]]; then echo "You need to pass a playbook as argument to this script." exit 1 fi export SSL_CERT_FILE=$(pwd)/cacert.pem export ANSIBLE_HOST_KEY_CHECKING=False if [[ ! -f "$SSL_CERT_FILE" ]]; then curl -O http://curl.haxx.se/ca/cacert.pem fi ansible-playbook -v -i inventory/ "$PLAYBOOK"
Создание виртуальной машины
Модуль GCE предоставляет возможность развертывания виртуальных машин в Google Compute Engine. Задача развертывания обычно выполняется с вашего сервера управления Ansible по отношению к API Google Cloud.
Плейбук будет выглядеть следующим образом:
- name: Create instance(s)
hosts: localhost
gather_facts: no
connection: local
vars:
machine_type: n1-standard-1 # default
image: debian-7
service_account_email: unique-id@developer.gserviceaccount.com
credentials_file: /path/to/project.json
project_id: project-id
tasks:
- name: Launch instances
gce:
instance_names: dev
machine_type: "{{ machine_type }}"
image: "{{ image }}"
service_account_email: "{{ service_account_email }}"
credentials_file: "{{ credentials_file }}"
project_id: "{{ project_id }}"
tags: webserver
register: gce
- name: Wait for SSH to come up
wait_for: host={{ item.public_ip }} port=22 delay=10 timeout=60
with_items: "{{ gce.instance_data }}"
- name: Add host to groupname
add_host: hostname={{ item.public_ip }} groupname=new_instances
with_items: "{{ gce.instance_data }}"
- name: Manage new instances
hosts: new_instances
connection: ssh
sudo: True
roles:
- base_configuration
- production_server
Обратите внимание, что использование модуля «add_host» выше создает временную, находящуюся в памяти, группу. Это означает, что игра в том же плейбуке может затем управлять машинами в группе «new_instances», если это необходимо. На данном этапе возможна любая произвольная конфигурация.
Настройка виртуальных машин в группе
Все созданные виртуальные машины в GCE сгруппированы по тегу. Поскольку это облако, лучше всего игнорировать имена хостов и просто сосредоточиться на управлении группами.
Обычно мы также использовали бы роли здесь, но следующий пример простой. Здесь мы также используем модуль «gce_net» для открытия доступа к порту 80 на этих узлах.
Переменные в разделе «vars» также можно хранить в файле «vars_files» или как-то зашифровать с помощью Ansible-vault, если вы этого пожелаете. Это просто базовый пример того, что возможно:
- name: Setup web servers
hosts: tag_webserver
gather_facts: no
vars:
machine_type: n1-standard-1 # default
image: debian-7
service_account_email: unique-id@developer.gserviceaccount.com
credentials_file: /path/to/project.json
project_id: project-id
roles:
- name: Install lighttpd
apt: pkg=lighttpd state=installed
sudo: True
- name: Allow HTTP
local_action: gce_net
args:
fwname: "all-http"
name: "default"
allowed: "tcp:80"
state: "present"
service_account_email: "{{ service_account_email }}"
credentials_file: "{{ credentials_file }}"
project_id: "{{ project_id }}"
Указав в своем браузере IP-адрес сервера, вы должны увидеть страницу, приветствующую вас.
Обновления данного документа приветствуются, нажмите на ссылку github в правом верхнем углу этой страницы, если вы хотите внести дополнения!
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.4/guide_gce.html