Я настраиваю сервер с 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
поэтому соединение будет сброшено только в случае необходимости.