Как переключить пользователя на задание или набор задач?

Повторяющаяся тема, которая в моих загружаемых книжках заключается в том, что я часто должен выполнять команду с привилегиями sudo (sudo: yes), потому что я хотел бы сделать это для определенного пользователя. В идеале я бы предпочел использовать sudo для переключения на этого пользователя и выполнять команды в обычном режиме. Потому что тогда мне не придется выполнять очистку моих обычных сообщений, таких как каталоги chowning. Вот фрагмент из одной из моих плейбуков:

- 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

В идеале я мог запускать команды или наборы команд в качестве другого пользователя, даже если для этого пользователя требуется sudo.

Ответ 1

С Ansible 1.9 или новее

Ansible использует директивы become, become_user и become_method для достижения эскалации привилегий. Вы можете применить их к целой пьесе или playbook, установить их в включенном playbook или установить их для конкретной задачи.

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user

Вы можете использовать become_with, чтобы указать, как достигается эскалация привилегий, по умолчанию sudo.

Директива действует для области блока, в которой она используется (примеры).

См. Хосты и Пользователи для некоторых дополнительных примеров и Стать (Привилегированная эскалация ) для более подробной документации.

В дополнение к директивам become и become_user с заданной областью применения, Ansible 1.9 добавил некоторые новые переменные и параметры командной строки, чтобы установить эти значения в течение продолжительности воспроизведения в отсутствие явных директив:

Как и в случае с Ansible 2.0.2.0, более старый синтаксис sudo/sudo_user, описанный ниже, все еще работает, но в уведомлении об устаревании говорится: "Эта функция будет удалена в будущей версии".


Предыдущий синтаксис, устаревший с версии Ansible 1.9 и запланированный для удаления:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user

Ответ 2

В Ansible > 1.4 вы можете фактически указать удаленного пользователя на уровне задачи, который должен позволить вам войти в систему как этот пользователь и выполнить эту команду, не прибегая к sudo. Если вы не можете войти в систему в качестве этого пользователя, тогда решение sudo_user тоже будет работать.

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

См. http://docs.ansible.com/playbooks_intro.html#hosts-and-users

Ответ 3

В Ansible 2.x вы можете использовать block для группы задач:

- 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

Ответ 4

Решение состоит в том, чтобы использовать оператор include с remote_user var (описать там: http://docs.ansible.com/playbooks_roles.html), но это должно быть сделанное в playbook вместо уровня задачи.