Задача: Нам необходимо создать новую виртуальную машину используя облачный API, добавить ее в файл инвентаризации, затем использовать внутри того же сценария В данной статье приводится пример с использованием провайдера: Vultr . Но справедливо для любых других облачных платформ. Для начала определим переменные. Зайдите в свой профиль Vultr и получите API key. Создайте файл переменных где вам более удобно. Это может быть файл: host_vars/localhost.yml
vultr_common:
apikey: YOUR_API_KEY_HERE
sshkey_name: myansible
inventory_file: /etc/ansible/hosts
# default variables for Vultr host VPS
target_os: "Ubuntu 18.10 x64"
target_plan: "2048 MB RAM,55 GB SSD,2.00 TB BW"
target_region: "New Jersey"
Далее мы должны добавить наш
SSH ключ в облачный хостинг и создать виртуальную машину с ним. Ниже приводится пример такого сценария. Замените путь к вашему ключу в переменной ssh_key , или создайте его, используя утилиту ssh-keygen. Определите переменную servername , *или задайте ее в командной строке: ansible-playbook -e servername=your.name*.
# check global ssh keys on Vultr
- name: "Setup Deployment"
hosts: localhost
connection: local
gather_facts: false
tasks:
- name: "Set vars"
set_fact:
target_servername={{ servername }}
target_hostname={{ servername }}
target_group=mail
- name: "Ensure an SSH key is present"
delegate_to: localhost
vultr_ssh_key:
api_key: "{{ vultr_common.apikey }}"
name: "{{ vultr_common.sshkey_name }}"
ssh_key: "{{ lookup('file', '/etc/ansible/id_ansible_rsa.pub') }}"
# deploy server
- name: "Ensure a cloud server exists"
delegate_to: localhost
vultr_server:
api_key: "{{ vultr_common.apikey }}"
name: "{{ target_servername }}"
hostname: "{{ target_hostname }}"
tag: "auto-created"
os: "{{ vultr_common.target_os }}"
plan: "{{ vultr_common.target_plan }}"
region: "{{ vultr_common.target_region }}"
ssh_key: "{{ vultr_common.sshkey_name }}"
state: present
register: BUILD
Смотрите более подробное описание модуля
vultr_server в официальной документации Ansbile. Далее вы можете подождать, пока сервер запустится:
# wait start
- name: "Wait for server starting up."
wait_for:
port: 22
host: "{{ BUILD.vultr_server.v4_main_ip }}"
delay: 10
Теперь можно обновить наш
inventory файл.
# Update Ansible inventory
- name: "Initialize SERVER list"
set_fact: SERVER=[]
when: (BUILD is defined)
# pupulate
- name: "Populate SERVER list"
set_fact:
SERVER: "{{ SERVER }} + [ '{{ BUILD.vultr_server.name }},{{ BUILD.vultr_server.v4_main_ip }},{{ BUILD.vultr_server.v6_mai
n_ip }}' ]"
target_ip: "{{ BUILD.vultr_server.v4_main_ip }}"
target_passwd: "{{ BUILD.vultr_server.default_password }}"
when: (SERVER is defined)
# save to inventory file
- name: "Update inventory file with SERVER list"
delegate_to: localhost
ini_file:
dest: "{{ vultr_common.inventory_file }}"
section: "{{ target_group }}"
option: "{{ item.split(',')[0] }} ansible_host"
value: "{{ item.split(',')[1] }}"
no_extra_spaces: yes
mode: 0666
state: present
backup: no
with_items: "{{ SERVER }}"
when: (SERVER is defined)
Но мы не можем использовать обновленный файл инвентаризации прямо сейчас, в этом же сценарии! Старый файл будет закешировн системой на момент запуска сценария. Необходимо перечитать его. Для этого существует специальная мета-задача:
# Refrefh inventory after deployment with new server name
- name: "Refresh inventory file"
hosts: localhost
connection: local
gather_facts: false
tasks:
- meta: refresh_inventory
Готово! Внимание: Все предыдущие шаги выполнялись на
localhost! И только сейчас мы можем ставить задачи вновь созданным виртуальным машинам из файла инвентаризации:
# Deploy Mail server
- name: "Mail server deployment"
hosts: "mail"
tasks:
... here is your tasks on remote hosts
Удачи! Полезные ссылки:
https://www.renemoser.net/blog/2018/03/18/begin-vultr-with-ansible/ https://www.davideaves.com/2018/02/ansible-provisioning-vultr-servers/