Как переключить пользователя на задание или набор задач?
Повторяющаяся тема, которая в моих загружаемых книжках заключается в том, что я часто должен выполнять команду с привилегиями 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 вместо уровня задачи.