Ansible 创建和使用组而不重新启动
我有一个任务,它创建了一个组Ansible 创建和使用组而不重新启动,ansible,Ansible,我有一个任务,它创建了一个组 - name: add user to docker group user: name=USERNAME groups=docker append=yes sudo: true 在另一个剧本中,我需要运行一个依赖于拥有新组权限的命令。不幸的是,这不起作用,因为新组仅在我注销并再次登录后加载 我试过一些东西,比如: su-l用户名 或 newgrp-docker;新GRP 但什么都没用。是否有任何更改强制Ansible重新连接到主机并重新登录?重新启动是最后
- name: add user to docker group
user: name=USERNAME groups=docker append=yes
sudo: true
在另一个剧本中,我需要运行一个依赖于拥有新组权限的命令。不幸的是,这不起作用,因为新组仅在我注销并再次登录后加载
我试过一些东西,比如:
su-l用户名
或
newgrp-docker;新GRP
但什么都没用。是否有任何更改强制Ansible重新连接到主机并重新登录?重新启动是最后一个选项。对于Ansible 2,我创建了一个Galaxy角色: 用法:
- 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当然会重新使用开放的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在下一个任务中重新登录。我发现的另一个选项是使用
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秒。在我有限的测试中,它似乎解决了以最小延迟刷新当前用户组的问题。您可以使用任务:
-名称:将用户添加到docker组
ansible.builtin.user:
姓名:用户名
分组:docker
附加:是的
-名称:重置ssh连接以允许用户更改影响ansible用户
ansible.builtin.meta:
重置\u连接
请注意,只有当ansible.builtin.user
任务更改为“reset\u connection
任务不支持when
conditional”时,才能使用变量运行任务,请参阅
在Ansible 2.3中添加了
reset_connection
meta任务,但在排除v2.5.8之前仍然存在一些问题,请参见。在播放过程中尝试删除套接字文件夹,它在我这边起作用(我不知道这是否是最薄的解决方案)。奇怪的是,meta:reset_connection
不适用于Ansible 2.4
- name: reset ssh connection
local_action:
module: file
path: "~/.ansible/cp"
state: absent
除非您解释错误,否则组是使用
group
模块创建的,而不是user
。他可能是想说“将用户添加到组中”。安装docker可能已经创建了该组。(顺便说一句,我也面临着同样的问题)这正是我的问题。该组已经存在。我认为这与ansible坚持将ssh会话连接到主机以加快播放速度的方式有关。您使用的是什么版本的ansible,如果ansible.cfg中有关于ssh的任何设置,又会是什么?听起来可能很奇怪,而且很可能不是世界上最可靠的东西,但可能会重新启动sshd???。有没有办法在playbook中而不是在配置文件中添加ssh连接选项?还有,终止ssh会话似乎可以阻止ansible/vagrant重新登录。据我所知不是这样。不过,根据Ansible 2中的说法,可以在清单中定义它,这表明甚至可以通过定义一个具有该名称的变量来设置它。是的,如果我没记错的话,上面发布的kill/reconnect不再有效,因为我认为Ansible 1.9改变了ssh连接处理。从那时起,当失败时,无法捕获该级别的失败。Ansible 2 Galaxy角色在此不起作用,当任务运行时,Ansible向我请求SSH密码-而不是Ansible用户,但是对于本地用户来说,它甚至不存在于被管理的远程主机上——不管是作为任务或每个句柄调用——只是一个旁注,尽管这对ssh连接非常有效,但它对本地主机/ansible服务器不起作用。对于本地主机ansible服务器,您需要运行“exec sudo su--login$USER”或“exec newgrp$group”,但请注意,如果从ansible/bash脚本运行,这些命令将不起作用(ansible将看不到新的更新,并且bash脚本将在运行这些命令后立即退出/停止)/这些命令仅适用于交互式shell。我想知道这是否适用于本地主机连接,因为接受的答案仅适用于ssh连接。看起来像一个很酷的黑客解决方案,如果它能工作的话。