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
.
Хотя первоначальный ответ полезен и популярен, его можно обновить с учетом новейших изменений.
- Нет группы
wheel
в большинстве современных дистрибутивов, ноsudo
довольно распространено - Вам не нужно трогать (и ломать) системные файлы в
/etc
каталог, но следует использовать дополнительный путь, например/etc/sudoers.d
- Использовать
true/false
логические переменные, совместимые с ansible-lint - Я предпочитаю использовать переменные для любого рутинного кода, который можно копировать/вставлять между проектами без изменений.
Это обновленная версия:
- 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
)