web-dev-qa-db-fra.com

Ansible non-root Sudo user and "Become" elévation de privilèges

J'ai installé une boîte avec un utilisateur david qui a les 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 la "montée en privilèges" d'Ansible, j'obtiens un permission denied Erreur. Un simple playbook pourrait donc ressembler à ceci:

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 playbook 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 (en abrégé):

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 ai-je la permission refusée?

Informations supplémentaires

J'utilise Ansible 2.1.1.0 et je cible une boîte Ubuntu 16.04. Si j'utilise remote_user et Sudo options selon Ansible <v1.9, cela fonctionne très bien, comme ceci: remote_user: david Sudo: yes

Mise à jour

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

15
DavB

Pourquoi ai-je la permission refusée?

Parce que APT nécessite les autorisations root (voir l'erreur: are you root?) et vous exécutez les tâches en tant que 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 devant.


l'utilisateur 'david' sur le boîtier distant dispose des privilèges Sudo.

Cela signifie que david peut exécuter des commandes (certaines ou toutes) en utilisant Sudo- exécutable pour changer l'utilisateur effectif pour le processus enfant (la commande). Si aucun nom d'utilisateur n'est donné, ce processus s'exécute en tant que 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 qu'Ansible (connexion avec SSH en utilisant votre compte) devez exécuter:

Sudo apt-get install sqlite3

ne pas:

Sudo david apt-get install sqlite3

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


Le playbook suivant sera transmis 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
26
techraf

remote_user est david. Appelez le script avec --ask-pass et donnez le mot de passe pour david. Si david n'a pas de Sudo sans mot de passe, vous devez également 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
4
helloV