Ansible权限问题

我试图将当前用户添加到系统中的一个组中,然后执行一个需要该组权限的命令。 我的手册是这样的:

- 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 

问题是,所有这些都发生在同一个shell中。 stream浪者的shell还没有被新的组更新。 是否有一种干净的方式来刷新Ansible中的用户当前组? 我想我需要得到它重新连接或打开一个新的shell。

不过,我试图打开一个新的壳,它只是挂起:

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

当然,它永远不会退出!

与newgrp相同的东西

 - name: Refresh the groups shell: newgrp 

因为它基本上做同样的事情。

有任何想法吗?

Solutions Collecting From Web of "Ansible权限问题"

阅读手册。

这里的一个解决方案是对'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 

它的工作原理!

我已经看到这个问题在capistranochef ,它发生,因为你已经有一个会议,尚未有该组的用户,你需要关闭会议,并打开新的会话,让用户看到的组添加。

正如其他人已经指出,这是因为到远程主机的主动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 

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

我在使用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"