Назад | Перейти на главную страницу

Недоразумение в концепции многокапельного развертывания Ansible Digital Ocean APIv2

У меня возникли концептуальные проблемы с получением Ansible для работы с Digital Ocean APIv2 для развертывания нескольких капель. Обычно я определяю список хостов в файле хостов Ansible, и именно так Ansible будет перебирать каждый хост для настройки конфигурации, но поскольку при развертывании новых хостов мы общаемся с localhost (то есть действительно разговариваем с API Digital Oceans), Я не могу понять, как перебирать весь список новых хостов для развертывания. Мой playbook отлично подходит для одного узла. Прямо сейчас пользователю предлагается ввести имя хоста для новой создаваемой капли. Однако в идеале я хочу запустить playbook для списка, скажем, из 20 имен хостов, и playbook создаст все 20 хостов без вмешательства пользователя. Может ли кто-нибудь помочь.

---
- hosts: localhost

  vars_prompt:
    - name: "hostname"
      prompt: "Hostname of new droplet?"
      private: no

  vars:
    do_token: PRIVATE_TOKEN_HERE

  tasks:
  - name: Create new droplet
    digital_ocean: >
      state=present
      command=droplet
      name={{ hostname }}
      unique_name=yes
      size_id=512mb
      region_id=nyc3
      image_id=ubuntu-18-04-x64
      ssh_key_ids=PRIVATE_SSH_KEY_HERE
      api_token={{ do_token }}
      wait_timeout=500
    register: hostname

  - name: Add host to Ansible config
    lineinfile:
      dest: "/etc/ansible/hosts"
      insertafter: '^\[DROPLETS\]'
      state: present
      line: "{{ hostname.droplet.name }} ansible_ssh_host={{ hostname.droplet.ip_address }}"

Определение списка хостов в файле и его использование в качестве инвентаря - это путь, по которому нужно идти. Вы бы просто использовали delegate_to: localhost или connection: local для задач, вызывающих API DO. Например:

tasks:
- name: Create new droplet
  digital_ocean: >
    state=present
    ...
  delegate_to: localhost
- name: Add the user 'johnd' with a specific uid and primary group of 'admin'
  user:
    name: johnd
    comment: John Doe
    uid: 1040
    group: admin

Если доступ DO api не настроен на доступном хосте, вы можете использовать этот хост в своем delegate_to:

Изменить в ответ на комментарий:

Да, либо создайте отдельный файл инвентаризации и используйте --inventory-file при запуске playbook или создании группы PROVISION (это то, что я использую ниже). Обратите внимание на использование inventory_hostname

---
- hosts: PROVISION

  vars:
    do_token: PRIVATE_TOKEN_HERE

  tasks:
  # runs on ansible control host
  - name: Create new droplet
    digital_ocean: >
      state=present
      command=droplet
      name={{ inventory_hostname }}
      unique_name=yes
      size_id=512mb
      region_id=nyc3
      image_id=ubuntu-18-04-x64
      ssh_key_ids=PRIVATE_SSH_KEY_HERE
      api_token={{ do_token }}
      wait_timeout=500
    register: hostname
    delegate_to: localhost

  # runs on ansible control host    
  - name: Add host to Ansible config
    lineinfile:
      dest: "/etc/ansible/hosts"
      insertafter: '^\[DROPLETS\]'
      state: present
      line: "{{ hostname.droplet.name }} ansible_ssh_host={{ hostname.droplet.ip_address }}"
    delegate_to: localhost

  # runs on newly created droplet
  - name: Add the user 'johnd' with a specific uid and primary group of 'admin'
    user:
      name: johnd
      comment: John Doe
      uid: 1040
      group: admin