Создать и использовать группу без перезагрузки

У меня есть задача, которая создает группу.

- name: add user to docker group
  user: name=USERNAME groups=docker append=yes
  sudo: true

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

Я пробовал некоторые вещи, такие как:

su -l USERNAME

or

newgrp docker; newgrp

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


person Mark    schedule 31.10.2014    source источник
comment
Если вы что-то не так объяснили, группы создаются с помощью модуля group, а не user.   -  person Mxx    schedule 01.11.2014
comment
Вероятно, он хотел сказать, что добавляет пользователя в группу. Установка докера уже создала бы группу. (Кстати, я столкнулся с той же проблемой)   -  person Gigablah    schedule 03.11.2014
comment
Именно в этом моя проблема. Группа уже существует.   -  person Mark    schedule 03.11.2014
comment
Я думаю, что это связано с тем, как ansible продолжает поддерживать сеанс ssh, подключенный к вашему хосту, чтобы ускорить запуск игр. Какую версию ansible вы используете и какие настройки в вашем ansible.cfg есть в отношении ssh?   -  person Bruce P    schedule 14.11.2014
comment
Может показаться странным, и, скорее всего, это будет не самая надежная вещь в мире, но, может быть, перезапустить sshd??..   -  person Assaf Lavie    schedule 09.12.2014
comment
возможный дубликат проблемы с разрешениями Ansible   -  person udondan    schedule 02.02.2015
comment
Текущий ответ, помеченный udondan как правильный, больше не актуален или неверен. См. Ответ @xiaket относительно метазадачи, которая сейчас является официальным и поддерживаемым способом сделать это.   -  person James    schedule 21.09.2018


Ответы (4)


Вы можете использовать задачу (ansible.builtin.)meta: reset_connection:

- name: add user to docker group
  ansible.builtin.user:
    name: USERNAME
    groups: docker
    append: yes
- name: reset ssh connection to allow user changes to affect ansible user
  ansible.builtin.meta:
    reset_connection

Обратите внимание, что вы не можете не использовать переменную для запуска задачи только тогда, когда задача ansible.builtin.user внесла изменение, поскольку «задача reset_connection не поддерживает when условие», см. #27565.

Метазадача reset_connection была добавлена ​​в Ansible 2.3, но оставалась немного ошибочной, пока не была исключена версия 2.5.8, см. № 27520.

person xiaket    schedule 26.06.2017
comment
Просто примечание: хотя это отлично работает для ssh-соединений, оно не будет работать для локального хоста/доступного сервера. Для локального хост-сервера ansible вам нужно будет запустить exec sudo su --login $USER или exec newgrp $group, но обратите внимание, что они не будут работать, если они запущены из скрипта ansible/bash (ansible не увидит новые обновления, и сценарий bash немедленно выйдет / остановится после выполнения этих команд) / эти команды работают только для интерактивной оболочки. - person neokyle; 30.12.2019

Для Ansible 2 я создал роль Galaxy: https://galaxy.ansible.com/udondan/ssh-reconnect/

Применение:

- name: add user to docker group
  user: name=USERNAME groups=docker append=yes
  sudo: true
  notify:
    - Kill all ssh connections

Если вам срочно нужна новая группа, вы можете вызвать модуль самостоятельно:

- name: Kill own ssh connections
  ssh-reconnect: all=True

Или, в качестве альтернативы, запускайте обработчики, когда это необходимо.

- meta: flush_handlers

Для Ansible ‹ 1.9 см. этот ответ:

Используете ли вы управляющие сокеты ssh? Если вы активировали ControlMaster в своей конфигурации ssh, это объясняет поведение. Ansible повторно подключается для каждой задачи, поэтому пользователю должна быть назначена правильная роль для следующей задачи. Хотя, когда вы используете совместное использование сеанса ssh, Ansible, конечно, повторно использует открытое соединение ssh и, следовательно, не может снова войти в систему.

Вы можете отключить совместное использование сеанса в своем ansible.cfg:

[ssh_connection]
ssh_args= -S "none"

Поскольку совместное использование сеансов — это хорошая вещь для ускорения воспроизведения Ansible, есть альтернатива. Запустите задачу, которая убьет все соединения ssh для вашего текущего пользователя.

- name: add user to docker group
  user: name=USERNAME groups=docker append=yes
  sudo: true
  register: user_task

- name: Kill open ssh sessions
  shell: "ps -ef | grep sshd | grep `whoami` | awk '{print \"kill -9\", $2}' | sh"
  when: user_task | changed
  failed_when: false

Это заставит Ansible повторно войти в систему при следующей задаче.

person udondan    schedule 29.01.2015
comment
Есть ли способ добавить этот параметр подключения ssh в playbook, а не в файл конфигурации? - person codecowboy; 08.01.2016
comment
Кроме того, уничтожение сеансов ssh, по-видимому, предотвращает повторный вход в систему ansible/vagrant. - person codecowboy; 08.01.2016
comment
Не то, что я знаю из. Хотя, согласно этому ответу, в Ansible 2 можно определить его в инвентаре, что предполагает, что это даже возможно чтобы установить его, определив переменную с этим именем. - person udondan; 08.01.2016
comment
Спасибо. вот проблема, с которой я столкнулся serverfault.com/questions/747604/ - person codecowboy; 08.01.2016
comment
Да, если я правильно помню, kill/reconnect, как указано выше, больше не работает, так как, я думаю, Ansible 1.9, поскольку они изменили обработку ssh-соединения. С тех пор неудачники на этом уровне не могут быть пойманы с помощью failed_when. - person udondan; 08.01.2016
comment
В мой ответ добавлено решение для Ansible 2. - person udondan; 09.02.2016
comment
не notify ищет обработчик по его name ? он говорит Kill ALL ssh connections в операторе notify:, но Kill OWN ssh connections в атрибуте - name:; я что-то не так понял или это просто ошибка? - person ssc; 05.06.2017
comment
решение для Ansible ‹ 1.9 не работает на Ansible 2; задача Kill open ssh sessions завершается с ошибкой Failed to connect to the host via ssh: Shared connection to 172.16.200.128 closed. (DOH!) - person ssc; 05.06.2017
comment
роль Ansible 2 Galaxy здесь не работает, при запуске задачи Ansible запрашивает у меня пароль SSH - не для пользователя Ansible, а для локального пользователя, которого даже не существует на управляемом удаленном хосте - неважно если вызывается как задача или для обработчика - person ssc; 05.06.2017

Другой вариант, который я нашел, — это использовать async: для постановки в очередь убийства sshd в фоновом режиме, не полагаясь на открытое соединение. Это кажется невероятно хакерским, но, кажется, надежно работает как в Ansible 1.9, так и в 2.0.

- name: Kill SSH
  shell: sleep 1; pkill -u {{ ansible_ssh_user }} sshd
  async: 3
  poll: 2

Сделайте паузу на 1 секунду, затем убейте sshd. Начните проверку завершения задания через 2 секунды, максимально допустимое время — 3 секунды. В моем ограниченном тестировании кажется, что проблема обновления групп текущего пользователя решается с минимальной задержкой.

person Ben Batschelet    schedule 20.05.2016

Попробуйте удалить папку socket во время игры, у меня работает (не знаю, самое ли это решение). Как ни странно, meta: reset_connection не работает с Ansible 2.4.

- name: reset ssh connection
  local_action:
    module: file
    path: "~/.ansible/cp"
    state: absent
person K.F.    schedule 05.03.2018
comment
Мне было бы любопытно, работает ли это с локальными подключениями, потому что принятый ответ работает только с подключениями ssh. Выглядит как классное решение для взлома, если оно работает. - person neokyle; 30.12.2019