Автоматическое обновление файла инвентаризации Ansible

Задача: Нам необходимо создать новую виртуальную машину используя облачный 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/

Tagged with:

Добавить комментарий

Ваш e-mail не будет опубликован.