Ansible: создать пользователя с привилегиями sudo

Я взял на себя сервер Ubuntu 14.04. У него есть пользователь с именем "deployer" (используется с capistrano), и поэтому ему нужны привилегии sudo. С помощью этой настройки я могу войти на сервер и делать такие вещи, как:

workstation> ssh deployer@myserver
myserver>  sudo apt-get install git
myserver> exit
workstation>

Я пытаюсь выяснить, как использовать Ansible (версия 2.0.2.0 и python 2.7.3) для создания пользователя с именем "deployer" и возможности войти на сервер с этим идентификатором, а затем использовать такие вещи, как "apt" -установить ". Мой playbook выглядит так:

---
- hosts: example
  become: yes
  tasks:
  - name: Update apt cache
    apt:
      update_cache: yes
      cache_valid_time: 3600

  - group: name=sudo state=present

  - name: Add deployer user and add it to sudo
    user: name=deployer
          state=present
          createhome=yes
    become: yes
    become_method: "sudo"

  - name: Set up authorized keys for the deployer user
    authorized_key: user=deployer key="{{item}}"
    with_file:
      - /home/jaygodse/.ssh/id_rsa.pub

После запуска этой книги воспроизведения я могу подключиться к компьютеру по протоколу ssh как "deployer" (например, ssh deployer @ myserver), но если я запускаю команду sudo, она всегда запрашивает мой пароль sudo.

Я понимаю, что в конечном итоге пользователь "развертывателя" должен найти свой путь в файле пользователей visudo, но я не могу понять, какие магические заклинания Ansible следует вызывать, чтобы я мог подключиться к ssh на машине в качестве развертывателя и затем выполнить команду sudo (например, sudo). apt-get install git ") без запроса пароля sudo.

Я искал высоко и низко, и я не могу найти фрагмент пьесы Ansible, который помещает пользователя "deployer" в группу sudo без пароля. Как это сделать?

4 ответа

Иногда он знает, что спросить. Я не знал, как я разработчик, который взял на себя некоторые работы DevOps.

Видимо, "пароль без пароля" или вход в NOPASSWD - это то, что вам нужно поместить в файл /etc/sudoers.

Ответ на мой вопрос в Ansible: лучшая практика для ведения списка sudoers.

Фрагмент кода пьесы Ansible выглядит следующим образом из моей проблемы:

- name: Make sure we have a 'wheel' group
  group:
    name: wheel
    state: present

- name: Allow 'wheel' group to have passwordless sudo
  lineinfile:
    dest: /etc/sudoers
    state: present
    regexp: '^%wheel'
    line: '%wheel ALL=(ALL) NOPASSWD: ALL'
    validate: 'visudo -cf %s'

- name: Add sudoers users to wheel group
  user: name=deployer groups=wheel append=yes state=present createhome=yes


- name: Set up authorized keys for the deployer user
  authorized_key: user=deployer key="{{item}}"
  with_file:
    - /home/railsdev/.ssh/id_rsa.pub

И самое приятное, что решение идемпотентно. Это не добавляет строку

%wheel ALL=(ALL) NOPASSWD: ALL

в /etc/sudoers, когда playbook запускается в следующий раз. И да... Я смог подключиться к серверу как ssh-сервер и выполнить команды sudo без необходимости ввода пароля.

To create a user with sudo privileges is to put the user into /etc/sudoers, or make the user a member of a group specified in /etc/sudoers. And to make it password-less is to additionally specify NOPASSWD in /etc/sudoers.

Example of /etc/sudoers:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL

And instead of fiddling with /etc/sudoers file, we can create a new file in /etc/sudoers.d/ directory since this directory is included by /etc/sudoers by default, which avoids the possibility of breaking existing sudoers file, and also eliminates the dependency on the content inside of /etc/sudoers.

To achieve above in Ansible, refer to the following:

- name: sudo without password for wheel group
  copy:
    content: '%wheel ALL=(ALL:ALL) NOPASSWD:ALL'
    dest: /etc/sudoers.d/wheel_nopasswd
    mode: 0440

You may replace %wheel with other group names like %sudoers or other user names like deployer.

Хотя первоначальный ответ полезен и популярен, его можно обновить с учетом новейших изменений.

  1. Нет группыwheelв большинстве современных дистрибутивов, ноsudoдовольно распространено
  2. Вам не нужно трогать (и ломать) системные файлы в/etcкаталог, но следует использовать дополнительный путь, например/etc/sudoers.d
  3. Использоватьtrue/falseлогические переменные, совместимые с ansible-lint
  4. Я предпочитаю использовать переменные для любого рутинного кода, который можно копировать/вставлять между проектами без изменений.

Это обновленная версия:

      - name: Add {{ sudo_user }} user
  user:
    name: "{{ sudo_user }}"
    groups: sudo
    append: true
    state: present
    createhome: true

- name: Make sudo without password for {{ sudo_user }} user
  copy:
    dest: /etc/sudoers.d/80-ansible-sudo-user
    content: "{{ sudo_user }} ALL=(ALL) NOPASSWD:ALL"
    mode: 0440

Используя visudo, нажмите Shift+G И добавить в конец файла:

deployer  ALL=(ALL)       NOPASSWD: ALL

тогда пиши и выходи (:wq)

Другие вопросы по тегам