无需重启即可创建和使用组

时间:2014-10-31 14:29:53

标签: ansible

我有一个创建组的任务。

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

在另一个剧本中,我需要运行一个依赖于拥有新组权限的命令。不幸的是,这不起作用,因为只有在我注销并再次登录后才会加载新组。

我尝试了一些类似的东西:

su -l USERNAME

newgrp docker; newgrp

但没有任何效果。是否有任何更改迫使Ansible重新连接到主机并进行重新连接?重启将是最后一个选择。

4 个答案:

答案 0 :(得分:23)

对于Ansible 2.3或更高版本,请使用meta: reset_connection

- user: name={{ansible_user}} groups=input
- name: reset ssh connection to allow user changes to affect 'current login user'
  meta: reset_connection

答案 1 :(得分:15)

对于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控件套接字吗?如果您在ssh配置中激活ControlMaster,则可以解释该行为。 Ansible为每个任务重新连接,因此用户应该在下一个任务中分配正确的角色。虽然当你使用ssh会话共享时,Ansible当然会重新使用open 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在下一个任务中重新登录。

答案 2 :(得分:3)

我发现的另一个选项是使用vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015' vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIM|quit' | tr -d '\015' 在后​​台排队查看async:,而不依赖于打开的连接。它感觉令人难以置信的hacky,但它似乎在Ansible 1.9和2.0中都可靠地工作。

sshd

暂停1秒钟,然后杀死- name: Kill SSH shell: sleep 1; pkill -u {{ ansible_ssh_user }} sshd async: 3 poll: 2 。 2秒后开始检查作业完成,最长允许时间为3秒。在我的有限测试中,它似乎解决了只用最小延迟刷新当前用户组的问题。

答案 3 :(得分:0)

尝试在播放期间删除套接字文件夹,它可以在我身边工作(我不知道它是否是最最好的解决方案)。奇怪的是,meta: reset_connection无法使用Ansible 2.4

- name: reset ssh connection
  local_action:
    module: file
    path: "~/.ansible/cp"
    state: absent