Ansible:创建具有sudo特权的用户


74

我已经接管了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”的用户,并能够使用该ID登录到服务器,然后使用诸如“ apt”之类的类似东西。 -get install”。我的剧本看起来像这样:

---
- 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 @ myserver)以ssh身份进入计算机,但如果运行sudo命令,它将始终要求我提供sudo密码。

我了解“部署者”用户最终必须找到进入visudo用户文件的方式,但是我无法弄清楚要调用哪个神奇的Ansible咒语,以便我可以作为部署者使用ssh进入计算机,然后运行sudo命令(例如sudo apt-get install git“),而不会提示您输入sudo密码。

我搜索了很多内容,但似乎找不到Ansible剧本片段,该片段可将用户“部署者”放入sudo组而无需密码。怎么做?


Answers:


141

有时它知道要问什么。我不知道我是从事某些DevOps工作的开发人员。

显然,“ passwordless”或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。是的...我能够以“部署者”身份进入服务器并运行sudo命令,而无需提供密码。


67
在保存之前,请将该行添加validate: 'visudo -cf %s'到本lineinfile:节的末尾以进行验证。弄乱sudoers文件将使您永久无法进行sudo访问。
西蒙·伍德赛德

2
authorized_key 接受键作为字符串key自V1.9参数

7
您也可以在中创建/复制文件/etc/sudoers.d,大多数发行版都默认为此包含行...
Gert van den Berg

请注意,该validate命令可能需要完整的路径visudo才能工作。
马特·休斯

1
对于Ansible 2.3和更高版本,应将lineinfile中的参数dest更改为path。
靛蓝K

17

创建具有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文件的可能性,并且消除了对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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.