Возможность подключения к докеру с одинаковыми именами контейнеров на нескольких хостах - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь запустить ANSIBLE Playbook для нескольких хостов, на которых запущены контейнеры с одинаковыми именами. Есть 3 хоста, каждый из которых работает с контейнером, называемым «web». Я пытаюсь использовать соединение с докером.

Я использую типичный шаблон файла hosts, который отлично работает для запуска ANSI модулей на хосте.

- name: Ping
  ping:

- name: Add web container to inventory
  add_host:
    name: web
    ansible_connection: docker
    ansible_docker_extra_args: "-H=tcp://{{ ansible_host }}:2375"
    ansible_user: root
  changed_when: false

- name: Remove old logging directory
  delegate_to: web
  file:
    state: absent
    path: /var/log/old_logs

Работает только с первым хостом в hosts файле

PLAY [all]

TASK [Gathering Facts]
ok: [web1]
ok: [web2]
ok: [web3]


TASK [web-playbook : Ping]
ok: [web1]
ok: [web2]
ok: [web3]

TASK [web-playbook : Add sensor container to inventory] 
ok: [web1]

PLAY RECAP 
web1  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web2  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web3  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Я попытался установить name на web_{{ ansible_host }}, чтобы сделать его уникальным для хостов, но затем он пытается подключиться к web_web1. Я выполнял команды, используя sudo docker exec web rm -rf /var/log/old_logs, что, конечно, работает, но я хотел бы иметь возможность использовать эти модули непосредственно в контейнерах докера.

1 Ответ

0 голосов
/ 18 июня 2019

Результат, который вы получите, абсолютно ожидаем.Цитирование add_host документации

Этот модуль обходит цикл хоста воспроизведения и запускается только один раз для всех хостов в игре, если вам нужно его итерировать, используйтеконструкция цикла.

то есть вы не можете полагаться на цикл хостов для add_host и вам нужно сделать цикл самостоятельно.

Более того, вам определенно нужно иметь разные имена (т.е.inventory_hostname) для ваших динамически создаваемых хостов, но поскольку все ваши контейнеры-докеры имеют одинаковые имена, их ansible_host должно быть одинаковым.

Если все ваши хост-машины докеров находятся в группе dockerhosts,следующий playbook должен сделать работу.В настоящее время я не нахожусь в ситуации, когда я могу проверить это сам, поэтому вам, возможно, придется немного подстроиться.Дайте мне знать, помогло ли это вам, и если мне нужно отредактировать свой ответ.

Обратите внимание, что хотя задача add_host не будет проходить естественным образом, я оставил хосты в вашей исходной группе в первой игре, чтобыфакты собраны правильно и правильно заполнены в магической переменной hostvars

---
- name: Create dynamic inventory for docker containers
  hosts: dockerhosts

  tasks:
    - name: Add web container to inventory
      add_host:
        name: "web_{{ item }}"
        groups:
          - dockercontainers
        ansible_connection: docker
        ansible_host: web
        ansible_docker_extra_args: "-H=tcp://{{ hostvars[item].ansible_host }}:2375"
        ansible_user: root
      loop: "{{ groups['dockerhosts'] }}"

- name: Play needed commands on containers
  hosts: dockercontainers

  tasks:
    - name: Remove old logging directory
      file:
        state: absent
        path: /var/log/old_logs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...