8

I'm trying to add the current user to a group in the system, then execute a command that requires permission for that group. My playbook is like so:

- name: Add this user to RVM group
  sudo: true
  user: state=present name=vagrant append=yes groups=rvm group=rvm
- name: Install Ruby 1.9.3
  command: rvm install ruby-1.9.3-p448 creates=/usr/local/rvm/bin/ruby-1.9.3-p448

The problem is that all of this is happening in the same shell. vagrant's shell hasn't been updated with the new groups yet. Is there a clean way to refresh the user's current groups in Ansible? I figure I need to get it to re-connect or open a new shell.

However I tried opening a new shell and it simply hangs:

- name: Open a new shell for the new groups
  shell: bash

Of course it hangs: the process never exits!

Same thing with newgrp

- name: Refresh the groups
  shell: newgrp

Because it basically does the same thing.

Any ideas?

4

4 回答 4

4

阅读手册。

这里的一个解决方案是对“command”或“shell”模块使用“executable”参数。

所以我尝试像这样使用命令模块:

- name: install ruby 1.9.3
  command: rvm install ruby-1.9.3-p448 executable=/bin/bash creates=/usr/local/rvm/bin/ruby-1.9.3-p448
  ignore_error: true

但是剧本无限期地挂了。手册指出:

如果你想通过 shell 运行命令(比如你正在使用 <、>、| 等),你实际上需要 shell 模块。命令模块更安全,因为它不受用户环境的影响。

所以我尝试使用 shell 模块:

- name: install ruby 1.9.3
  shell: rvm install ruby-1.9.3-p448 executable=/bin/bash creates=/usr/local/rvm/bin/ruby-1.9.3-p448
  ignore_error: true

它有效!

于 2013-11-14T23:24:45.657 回答
3

正如其他人已经说过的,这是因为与远程主机的活动 ssh 连接。用户需要注销并重新登录才能激活新组。

单独的shell操作可能是单个任务的解决方案。但是,如果您想运行多个其他任务并且不想被迫自己编写所有命令并改用 Ansible 模块,请终止 ssh 连接。

- name: Killing all ssh connections of current user
  delegate_to: localhost
  shell: ssh {{ inventory_hostname }} "sudo ps -ef | grep sshd | grep `whoami` | awk '{print \"sudo kill -9\", \$2}' | sh"
  failed_when: false

shell我们没有使用 Ansibles 打开 ssh 连接,而是通过一个操作来启动我们自己的连接。然后我们杀死当前用户的所有打开的 ssh 连接。这将强制 Ansible 在下一个任务中重新登录。

于 2015-02-02T01:58:42.700 回答
2

我在 和 中看到了这个问题capistranochef它发生是因为您已经与尚未拥有该组的用户建立了一个会话,您需要关闭该会话并打开新会话以让用户看到已添加的组。

于 2013-11-09T05:50:02.647 回答
1

我在使用 Ansible 1.8 的 RHEL 7.0 上,接受的答案对我不起作用。我可以强制 Ansible 加载新添加的 rvm 组的唯一方法是使用sg.

- name: add user to rvm group
  user: name=ec2-user groups=rvm append=yes
  sudo: yes

- name: install ruby
  command: sg rvm -c "/usr/local/rvm/bin/rvm install ruby-2.0.0"
于 2015-02-01T21:09:28.710 回答