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连接。看起来像一个很酷的黑客解决方案,如果它能工作的话。