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» и иметь возможность войти на сервер с этим идентификатором, а затем такие sudo-ish вещи, как «apt -получить установку". Моя игровая книга выглядит так:

---
- 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 как «развертчик» (например, ssh deployer@myserver), но если я запускаю команду sudo, она всегда запрашивает мой пароль sudo.

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

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


person Jay Godse    schedule 19.05.2016    source источник
comment
Возможный дубликат Ansible: лучшая практика для ведения списка sudoers   -  person techraf    schedule 21.08.2018


Ответы (2)


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

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

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

Фрагмент кода Ansible playbook выглядит так из моей задачи:

- 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 без ввода пароля.

person Jay Godse    schedule 19.05.2016
comment
Добавьте строку validate: 'visudo -cf %s' в конец раздела lineinfile: для проверки перед сохранением. Если вы испортите файл sudoers, вы навсегда потеряете доступ к sudo. - person Simon Woodside; 23.12.2016
comment
authorized_key принимает ключ как строку в параметре key начиная с версии 1.9 - person Tim; 26.11.2017
comment
Вы также можете создать/скопировать файл в /etc/sudoers.d, большинство дистрибутивов по умолчанию включают строку для этого... - person Gert van den Berg; 08.12.2017
comment
Обратите внимание, что команде validate, вероятно, потребуется полный путь к visudo для работы. - person Matt Hughes; 24.05.2018
comment
@MattHughes validate: '/usr/sbin/visudo -cf %s' ‹- ты это имеешь в виду? - person Xalorous; 10.10.2018
comment
Почему мы добавляем пользователя в колесо, а не напрямую в группу sudo? - name: "Granting Administrative Privileges" user: name: deployer groups: sudo append: yes - person Milad; 02.12.2019
comment
Кстати. если вам интересно, что означает %s в validate, это пункт назначения (dest) или путь к файлу, который должен быть изменен. Вот документация. - person AdamKalisz; 02.04.2020
comment
Для Ansible 2.3 и более поздних версий параметр dest в lineinfile следует изменить на путь. - person Indika K; 03.08.2020
comment
вы забыли убедиться, что файл /etc/sudoers присутствует - person Jens Timmerman; 16.08.2020
comment
Я не думаю, что хорошо включать sudo без пароля для всех пользователей sudo. Он подходит для учетных записей автоматизации, но не для учетных записей пользователей. Лучше просто установить deployer ALL=(ALL) NOPASSWD:ALL - person openCivilisation; 24.04.2021

Чтобы создать пользователя с привилегиями sudo, нужно поместить пользователя в /etc/sudoers или сделать пользователя членом группы, указанной в /etc/sudoers. А чтобы сделать его беспарольным, нужно дополнительно указать NOPASSWD в /etc/sudoers.

Пример /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

И вместо того, чтобы возиться с файлом /etc/sudoers, мы можем создать новый файл в каталоге /etc/sudoers.d/, так как этот каталог включен в /etc/sudoers по умолчанию, что позволяет избежать возможности поломки существующего файла sudoers, а также устраняет зависимость от содержимого внутри /etc/sudoers.

Чтобы достичь вышеизложенного в Ansible, обратитесь к следующему:

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

Вы можете заменить %wheel другими именами групп, такими как %sudoers, или другими именами пользователей, такими как deployer.

person pallxk    schedule 27.04.2019
comment
Спасибо за этот ответ. Я добавил validate: '/usr/sbin/visudo -cf %s', чтобы убедиться, что синтаксис правильный и не заблокирует вас, если у вас есть опечатка. - person Jack Wire; 25.03.2021