Un thème récurrent dans mes playbooks ansible est que je dois souvent exécuter une commande avec les privilèges Sudo (Sudo: yes
) car je voudrais le faire pour un utilisateur donné. Idéalement, je préférerais de beaucoup utiliser Sudo pour basculer vers cet utilisateur et exécuter les commandes normalement. Parce qu'alors, je n'aurai pas à nettoyer mes commandes post habituelles telles que les répertoires de chowns. Voici un extrait d'un de mes playbooks:
- name: checkout repo
git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
Sudo: yes
- name: change perms
file: dest={{ dst }} state=directory mode=0755 owner=some_user
Sudo: yes
Idéalement, je pourrais exécuter des commandes ou des ensembles de commandes en tant qu'utilisateur différent, même si cela nécessite que Sudo su sue cet utilisateur.
Ansible utilise les directives become
, become_user
et become_method
pour obtenir une élévation de privilèges. Vous pouvez les appliquer à une pièce de jeu ou à un livre de jeu entier, les définir dans un livre de lecture inclus ou les définir pour une tâche particulière.
- name: checkout repo
git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
become: yes
become_user: some_user
Vous pouvez utiliser become_with
pour spécifier le mode d'obtention de l'élévation des privilèges, la valeur par défaut étant Sudo
.
La directive est en vigueur pour la portée du bloc dans lequel elle est utilisée ( exemples ).
Voir hôtes et utilisateurs pour des exemples supplémentaires et Devenir (escalade des privilèges) pour une documentation plus détaillée.
En plus des directives become
et become_user
relatives aux tâches, Ansible 1.9 a ajouté de nouvelles variables et options de ligne de commande pour définir ces valeurs pendant la durée d'une lecture en l'absence de directives explicites:
become
/become_user
équivalentes.Depuis Ansible 2.0.2.0, l'ancienne syntaxe Sudo
/Sudo_user
décrite ci-dessous fonctionne toujours, mais la notification de dépréciation indique: "Cette fonctionnalité sera supprimée dans une version ultérieure."
- name: checkout repo
git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
Sudo: yes
Sudo_user: some_user
Dans Ansible 2.x, vous pouvez utiliser le block
pour un groupe de tâches:
- block:
- name: checkout repo
git:
repo: https://github.com/some/repo.git
version: master
dest: "{{ dst }}"
- name: change perms
file:
dest: "{{ dst }}"
state: directory
mode: 0755
owner: some_user
become: yes
become_user: some user
Dans Ansible> 1.4, vous pouvez en fait spécifier un utilisateur distant au niveau de la tâche, ce qui devrait vous permettre de vous connecter en tant qu'utilisateur et d'exécuter cette commande sans recourir à Sudo. Si vous ne pouvez pas vous connecter en tant qu'utilisateur, la solution Sudo_user fonctionnera également.
---
- hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
remote_user: yourname
Voir http://docs.ansible.com/playbooks_intro.html#hosts-and-users
Une solution consiste à utiliser l'instruction include
avec remote_user
var (à décrire ici: http://docs.ansible.com/playbooks_roles.html ), mais vous devez le faire. au playbook au lieu du niveau de la tâche.
Vous pouvez spécifier become_method
pour remplacer la méthode par défaut définie dans ansible.cfg
(le cas échéant) et pouvant être définie sur l'un des Sudo, su, pbrun, pfexec, doas, dzdo, ksu
.
- name: I am confused
command: 'whoami'
become: true
become_method: su
become_user: some_user
register: myidentity
- name: my secret identity
debug:
msg: '{{ myidentity.stdout }}'
Devrait afficher
TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
"msg": "some_user"
}