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


повторяющаяся тема, которая находится в моих ansible playbooks, заключается в том, что я часто должен выполнять команду с привилегиями sudo (sudo: yes), потому что я хотел бы сделать это для определенного пользователя. В идеале я бы предпочел использовать sudo для переключения на этого пользователя и выполнения команд в обычном режиме. Потому что тогда мне не придется выполнять свои обычные команды post, такие как каталоги 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, чтобы подать в суд на этого пользователя.

4 119

4 ответа:

С Ansible 1.9 или более поздней версии

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

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

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

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

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

в дополнение к задаче-scoped 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

в 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

В Анзибль 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

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