У меня возникли концептуальные проблемы с получением 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