2015-11-04 4 views
6

Ich habe ein Playbook, das sicherstellt, dass alle Anforderungen lokal installiert sind. Ich bin mit ansible 2.0.0Warum läuft Ansible nicht Pip als Sudo-Benutzer?

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 ist surfer190 in Vars.

tun/Aufgaben/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 

bekomme ich folgende Fehlermeldung:

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"} 

das ist im Grunde ein permission denied. Daher wird der Befehl nicht mit sudo ausgeführt. Wie ich versuche sudo pip install passlib und es funktioniert.

Auch wenn ich mit -k laufen und das Sudo-Passwort eingeben, funktioniert es nicht. Beachten Sie, dass der Benutzer surfer190 ein Kennwort für sudo benötigt.

Was mache ich falsch?

+0

welche os sind Sie? '/ usr/local' ist nicht immer root. – cel

+0

Für mich ist es, läuft 'GNU/Linux'' Ubuntu 14.04' – surfer190

+0

@ surfer190 hast du versucht '' Methode_ ''? – frank

Antwort

1

So sieht es aus wie die minimale Konfiguration Sie brauchen:

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

    vars_files: 
     - vars/main.yml 

    roles: 
     - ... 

So sind die become_user Bedürfnisse der Benutzer sein, die ohne Pass sudo kann, denke ich. Wenn es keine become_user ist es irgendwie:

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

Add ‚sudo: yes‘ installieren dopy Aufgabe

- 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 

Wenn Sie feststellen, dass die Ausführung des Textbuch hängt, während die Aufgabe ausgeführt wird, dann ist es wahrscheinlich, dass ansible wartet auf die sudo passoword aber gibt es keine So können Sie das Passwort eingeben. Es gibt eine Möglichkeit, das zu umgehen. Aktualisieren Sie den unten angegebenen Abschnitt in der sudoers-Datei befindet sich in/etc/sudoers '

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

Seien Sie vorsichtig beim Bearbeiten von/etc/sudoers, die falschen Einträgen können Sie verhindern, dass die Anmeldung an den Server immer wieder.

+0

Beachten Sie, dass 'sudo: yes' mit 'ansible 2' veraltet ist. – surfer190

+0

Es ist jedoch abwärtskompatibel. Außerdem hatte ich eine harte Zeit, um den Ersatz dafür in ansible 2 herauszufinden. Per Ansible Docs wird Ersatz für Sudo, aber Disi nicht für mich arbeiten. Vielleicht habe ich es nicht richtig gemacht. –

+0

Ich denke, ich habe die Antwort gefunden, die einzige erforderliche Methode ist 'werden: ja'. Dies führt das Spiel/die Aufgabe als "root" aus. Das Ausführen mit einem bestimmten Benutzer mit 'were_user' funktioniert nicht für mich. – surfer190