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

Заставить Ansible выйти из системы для обновления групп пользователей

Я настраиваю сервер с Ansible и Docker. В настоящее время я изучаю обе технологии, поэтому, пожалуйста, потерпите, если я здесь слишком глуп.

Чтобы запускать команды Docker, пользователь должен быть в группе пользователей Docker. Итак, я делаю это:

-   name: Ensure group "docker" exists
    become: yes
    group:
        name: docker
    state: present

-   name: Add ansible user to docker group
    become: yes
    user:
        name: "{{ansible_user}}"
        groups: docker
        append: yes

В более поздней игре (но в той же книге) я делаю следующее:

-   name: build
    command: docker-compose build --pull
    args:
        chdir: /docker

-   name: start services
    command: docker-compose -f docker-compose.yml up -d
    args:
        chdir: /docker

Это никогда не срабатывает при первом запуске. Задача «построить» всегда терпит неудачу, жалуется, что не может найти докер (что связано с отсутствием прав доступа). Если я войду вручную как {{ansible_user}} Я могу нормально запустить докер, и если я подожду достаточно долго (я полагаю, что Ansible откроет новый сеанс SSH), playbook также работает нормально, что заставляет меня полагать, что {{ansible_user}} еще не набрал новую группу из-за того, что Ansible повторно использует сеанс SSH для всех задач в playbook.

Так что я должен делать? Я тоже пробовал

-   name: build
    become: yes
    become_user: "{{ansible_user}}"
    become_method: su
    command: docker-compose build --pull
    args:
        chdir: /docker

так что ansible войдет в новый сеанс, но это, вероятно, не удастся, потому что мне нужно ввести пароль, и я не думаю, что есть способ сделать это непосредственно в задаче.

Есть идеи, как решить эту проблему без взлома? Я не могу поверить, что это такой редкий вариант использования, что нет стандартного способа решить эту проблему. Наверное, я просто что-то не замечаю.

Я не уверен, сработает ли это для вас, но я предлагаю вам попробовать добавить reset_connection.

- name: reset ssh connection
  meta: reset_connection

Вот пример.

Вы можете добавить его в качестве обработчика и уведомить его из задач модификации пользователя / группы. Затем также добавьте meta: flush_handlers поэтому соединение будет сброшено только в случае необходимости.