我有一个创建组的任务。
- name: add user to docker group
user: name=USERNAME groups=docker append=yes
sudo: true
在另一个剧本中,我需要运行一个依赖于拥有新组权限的命令。不幸的是,这不起作用,因为只有在我注销并再次登录后才会加载新组。
我尝试了一些类似的东西:
su -l USERNAME
或
newgrp docker; newgrp
但没有任何效果。是否有任何更改迫使Ansible重新连接到主机并进行重新连接?重启将是最后一个选择。
答案 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