我试图将当前用户添加到系统中的一个组中,然后执行一个需要该组权限的命令。 我的手册是这样的:
- 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
当然,它永远不会退出!
确定UNIX别名的定义位置
在bash -i中可用的命令不能在bash -l中访问
在terminal/ Linux上查找包含特定date范围文件名的所有文件
在PS1之后添加换行符
与newgrp相同的东西
- name: Refresh the groups shell: newgrp
因为它基本上做同样的事情。
有任何想法吗?
Bash虽然循环不结束
在RaspBerry PI上启动后运行Shell脚本
Bash – 分割目录string
Sed未能取代UTF-8编码
阅读手册。
这里的一个解决方案是对'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
它的工作原理!
我已经看到这个问题在capistrano和chef ,它发生,因为你已经有一个会议,尚未有该组的用户,你需要关闭会议,并打开新的会话,让用户看到的组添加。
正如其他人已经指出,这是因为到远程主机的主动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"