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):
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
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