2015-11-04 12 views
6

Mam książeczkę, która zapewnia, że ​​wszystkie wymagania są zainstalowane lokalnie. Używam ansible 2.0.0Dlaczego Ansible nie działa w trybie Pip jako użytkownik sudo?

ansible-playbook site.yml -i staging 

site.yml:

--- 
    - hosts: localhost 
    become: yes 
    become_user: "{{ sudo_user }}" 
    connection: local 

    vars_files: 
     - vars/main.yml 

    roles: 
     - do 

sudo_user jest surfer190 w Vars.

zrobić/zadania/main.yml:

- name: make sure everything is installed 
    apt: name={{item}} state=installed 
    with_items: 
    - python-apt 
    - python-pycurl 
    - python-pip 
    - python-setuptools 

- name: Install dopy 
    pip: name={{ item }} 
    with_items: 
    - virtualenv 
    - dopy 
    - passlib 

pojawia się następujący błąd:

failed: [localhost] => (item=passlib) => {"cmd": "/usr/local/bin/pip install passlib", "failed": true, "invocation": {"module_args": {"name": "passlib"}, "module_name": "pip"}, "item": "passlib", "msg": "stdout: Collecting passlib\n Using cached passlib-1.6.5-py2.py3-none-any.whl\nInstalling collected packages: passlib\n\n:stderr: Exception:\nTraceback (most recent call last):\n File \"/usr/local/lib/python2.7/dist-packages/pip/basecommand.py\", line 211, in main\n status = self.run(options, args)\n File \"/usr/local/lib/python2.7/dist-packages/pip/commands/install.py\", line 311, in run\n root=options.root_path,\n File \"/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py\", line 646, in install\n **kwargs\n File \"/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py\", line 803, in install\n self.move_wheel_files(self.source_dir, root=root)\n File \"/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py\", line 998, in move_wheel_files\n isolated=self.isolated,\n File \"/usr/local/lib/python2.7/dist-packages/pip/wheel.py\", line 339, in move_wheel_files\n clobber(source, lib_dir, True)\n File \"/usr/local/lib/python2.7/dist-packages/pip/wheel.py\", line 310, in clobber\n ensure_dir(destdir)\n File \"/usr/local/lib/python2.7/dist-packages/pip/utils/__init__.py\", line 71, in ensure_dir\n os.makedirs(path)\n File \"/usr/lib/python2.7/os.py\", line 157, in makedirs\n mkdir(name, mode)\nOSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/passlib'\n"} 

Które jest w zasadzie permission denied. Więc nie uruchamia polecenia z sudo. Jak próbuję sudo pip install passlib i to działa.

Nawet jeśli uruchomię z -k i wprowadzę hasło sudo, to nie zadziała. Zauważ, że użytkownik surfer190 wymaga hasła do sudo.

Co robię źle?

+0

który os jesteś stronie? '/ usr/local' nie zawsze jest własnością root. – cel

+0

Dla mnie jest, uruchamianie 'GNU/Linux'' Ubuntu 14.04' – surfer190

+0

@ surfer190 Czy próbowałeś 'stać_method'? – frank

Odpowiedz

1

Wygląda więc na to minimalna config czego potrzebujesz to:

--- 
    - hosts: localhost 
    become: yes 
    become_user: "{{ sudo_user }}" 
    connection: local 

    vars_files: 
     - vars/main.yml 

    roles: 
     - ... 

tak więc become_user musi mieć użytkownik, który może sudo bez towarzysza myślę. Jeśli nie ma become_user nie powiedzie się z:

failed: [localhost] => (item=passlib) => {"failed": true, "item": "passlib", "parsed": false} 
[sudo via ansible, key=sgidbrejgqoibeozxncyhixnwsukxjbe] password: 
2

Dodaj „sudo: tak” Install dopy zadanie

- name: make sure everything is installed 
    apt: name={{item}} state=installed 
    with_items: 
    - python-apt 
    - python-pycurl 
    - python-pip 
    - python-setuptools 

- name: Install dopy 
    pip: name={{ item }} 
    with_items: 
    - virtualenv 
    - dopy 
    - passlib 
    sudo: yes 

Jeśli zauważysz, że wykonanie playbook zawiesza się podczas wykonywania zadania to jest prawdopodobne, że ansibl czeka na passoword sudo, ale tam nie ma sposób, w jaki możesz wpisać hasło. Jest sposób na obejście tego. Zaktualizować poniżej określonego fragmentu w pliku sudoers znajduje się w „/ etc/sudoers”

# Allow members of group sudo to execute any command 
%sudo ALL=(ALL:ALL) ALL 
yourusername ALL=NOPASSWD: ALL 

Bądź ostrożny podczas edycji/etc/sudoers, posiadające nieprawidłowe wpisy mogą uniemożliwiać zalogowanie się do serwera nigdy.

+0

Zwróć uwagę, że' sudo: yes' został przestarzały z 'ansible 2' – surfer190

+0

Jest jednak zgodny wstecz. Poza tym ciężko mi było wymyślić zastąpienie tego w ansibla 2. Dla ansible docs staje się zamiennikiem dla sudo, ale disi nie działa dla mnie. Być może nie robiłem tego dobrze. –

+0

Myślę, że znalazłem odpowiedź, jedyną potrzebną metodą jest "stać się: tak". To uruchamia grę/zadanie jako 'root'. Uruchamianie z konkretnym użytkownikiem za pomocą 'stój_użytkownik 'nie działa dla mnie. – surfer190

Powiązane problemy