web-dev-qa-db-fra.com

Comment changer d'utilisateur par tâche ou ensemble de tâches?

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.

144
rgrinberg

Avec Ansible 1.9 ou version ultérieure

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:

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


Syntaxe précédente, déconseillée à partir de Ansible 1.9 et dont la suppression est prévue:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  Sudo: yes
  Sudo_user: some_user
219
Brett

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
33
Arbab Nazar

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

22
trcarden

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.

7
Guillaume Dedrie

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"
}
1
avi.elkharrat