2013-11-08 4 views
7

Я пытаюсь добавить текущего пользователя в группу в системе, а затем выполнить команду, требующую разрешения для этой группы. Моя книжка такая же:Ansible Permissions Issue

- 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 

Проблема в том, что все это происходит в одной оболочке. оболочка vagrant еще не обновлена ​​новыми группами. Есть ли чистый способ обновить текущие группы пользователей в Ansible? Я полагаю, мне нужно заставить его снова подключиться или открыть новую оболочку.

Однако я попытался открыть новую оболочку и она просто висит:

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

Конечно, вешает: процесс никогда не выходит!

То же самое с newgrp

- name: Refresh the groups 
    shell: newgrp 

Потому что в принципе делает то же самое.

Любые идеи?

+0

Вы упомянули «playbook». Я полагаю, вы имеете в виду Blackberry Playbook? Может быть, удалить тег «Linux» и добавить тег «QNX»? – thom

+0

Это Ansible Playbook - файл управления конфигурацией. – brendan

ответ

4

Прочтите руководство.

Решение состоит в том, чтобы использовать параметр «исполняемый» для модулей «команда» или «оболочка».

Так что я попытался использовать командный модуль таким образом:

- 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 

Но Playbook висел на неопределенный срок. В manual состоянии:

Если вы хотите запустить команду через оболочку (скажем, вы используете <,>, |, и т.д.), вы на самом деле хотите, чтобы модуль оболочки вместо этого. Командный модуль намного более безопасен, так как он не зависит от среды пользователя.

Так что я попытался с помощью модуля оболочки:

- 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 

И это работает!

2

Я видел эту проблему в capistrano и chef, это происходит потому, что у вас уже есть сеанс для пользователя, у которого еще нет группы, вам нужно закрыть сеанс и открыть новый сеанс, чтобы пользователь мог видеть группа, которая была добавлена.

1

Я нахожусь на RHEL 7.0 используя Ansible 1.8, и принятый ответ не сработал для меня. Единственный способ заставить 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" 
+0

Проверьте мой другой ответ. Он должен работать везде. – udondan

2

Как уже указывалось, это связано с активным подключением 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 снова войти в систему при следующей задаче.

+0

Это очень интересный подход; надеюсь, у меня будет возможность попробовать это. – brendan