2016-12-05 5 views
2

J'ai mis en place une boîte avec un utilisateur david qui a des privilèges sudo. Je peux ssh dans la boîte et effectuer des opérations sudo comme apt-get install. Lorsque j'essaie de faire la même chose en utilisant "devenir escalade de privilèges" d'Ansible, j'obtiens une erreur permission denied. Alors simple Playbook pourrait ressembler à ceci:Antilisateur sudo non root et escalade de privilèges "devenir"

simple_playbook.yml:

--- 
- name: Testing... 
    hosts: all 
    become: true 
    become_user: david 
    become_method: sudo 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 

je lance ce livre de jeux avec la commande suivante:

ansible-playbook -i inventory simple_playbook.yml --ask-become-pass 

Cela me donne une invite pour un mot de passe, que je donne, et j'obtiens l'erreur suivante (abrégée):

fatal: [123.45.67.89]: FAILED! => {... 
failed: E: Could not open lock file /var/lib/dpkg/lock - open (13: 
Permission denied)\nE: Unable to lock the administration directory 
(/var/lib/dpkg/), are you root?\n", ...} 

Pourquoi suis-je obtenir des permis sion refusée?

Informations complémentaires

Je suis en Ansible 2.1.1.0 et je cible une boîte Ubuntu 16.04. Si j'utilise remote_user et sudo options par Ansible < v1.9, il fonctionne très bien, comme ceci: remote_user: david sudo: yes

Mise à jour

Les noms d'utilisateurs locaux et distants sont les mêmes. Pour que cela fonctionne, j'ai juste besoin de spécifier become: yes (voir la réponse de @ techraf):

+0

Quel est le nom d'utilisateur, l'utilisateur distant que vous utilisez pour effectuer la première connexion ssh? –

+0

Je pense que l'utilisateur devient root, change de racine à la place de david, et ça marchera. –

+0

@helloV - J'ai aussi essayé d'ajouter 'devenir vrai' à la tâche et le résultat est le même. – DavB

Répondre

11

Why am I getting permission denied?

Parce que APT nécessite permissions root (voir l'erreur: are you root?) et que vous exécutez les tâches david.

Par ces paramètres:

become: true 
become_user: david 
become_method: sudo 

Ansible devient david en utilisant la méthode sudo. Il exécute essentiellement son script Python avec sudo david à l'avant.


the user 'david' on the remote box has sudo privileges.

Cela signifie david peut exécuter des commandes (tout ou partie) à l'aide sudo -executable changer l'utilisateur effectif du processus de l'enfant (la commande). Si aucun nom d'utilisateur n'est donné, ce processus s'exécute sous le compte root.

Comparez les résultats de ces deux commandes:

$ sudo whoami 
root 
$ sudo david whoami 
david 

Retour au problème APT, vous (de CLI) ainsi que Ansible (connexion avec SSH en utilisant votre compte) ont besoin de courir:

sudo apt-get install sqlite3 

pas:

sudo david apt-get install sqlite3 

qui échouera avec le message très exact Ansible affiché.


Le PlayBook suivant escaladera par défaut à l'utilisateur root:

--- 
- name: Testing... 
    hosts: all 
    become: true 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 
+0

Merci @techraf pour l'explication. Si j'utilise 'remote_user: david' avec' devenir: true', cela semble fonctionner correctement. Ces paramètres sont-ils corrects dans cette situation? – DavB

+0

@DavB 'remote_user' n'a pas de relation directe avec les paramètres commençant par' devenir'. C'est le '' que vous utilisez dans la commande 'ssh @'. Dans l'un de vos commentaires, vous avez dit que vous utilisiez le même utilisateur 'david' sur le client et le serveur, d'où vous vous connectez avec' ssh '. Dans cette situation, 'remote_user: david' n'a pas d'effet **. Vous pouvez l'inclure, vous pouvez l'enlever. Rien ne va changer. Le problème était avec 'devenir_utilisateur: david'. Seulement. – techraf

+1

Vous auriez besoin de 'remote_user: david' ** si ** vous utilisiez Ansible sur votre ordinateur (client) en utilisant un compte nommé' davb' (ou tout autre que 'david'). – techraf

1

remote_user est david. Appelez le script avec --ask-pass et donnez le mot de passe pour david. Si david n'a pas sudo sans mot de passe, alors vous devriez aussi l'appeler avec --ask-become-pass.

- name: Testing... 
    hosts: all 
    remote_user: david 
    become: true 
    become_method: sudo 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 
+0

merci, mais je ne comprends pas ce que vous voulez dire. J'ai déjà spécifié '' devenir: true'' (et 'devient_méthode: sudo'). Pourriez-vous clarifier? – DavB

+0

@helloV J'ai aussi une question similaire sur ansible [ici] (https://stackoverflow.com/questions/48724920/copy-files-to-remote-servers-but-in-a-directory-which-belongs-to- un autre utilisateur) où je ne suis pas sûr de ce que je fais avec 'devenir 'ou' devenir_utilisateur'. Je voulais voir si vous pouviez aider? – user1950349