2016-05-19 109 views
24

我已经接管了Ubuntu 14.04服务器。它有一个叫做“部署者”(用于capistrano)的用户,因此它需要sudo权限。有了这个设置,我可以登录到服务器和做的东西,如:Ansible:使用sudo权限创建用户

workstation> ssh [email protected] 
myserver> sudo apt-get install git 
myserver> exit 
workstation> 

我试图找出如何使用Ansible(版本2.0.2.0和Python 2.7.3)创建一个用户名为“部署“并能够使用该ID登录到服务器,然后像sudo-ish那样的”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到机器的“部署”,(如SSH部署@ myserver的),但如果我运行sudo命令,它总是问我为我的sudo密码。

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

我已经搜索了高和低,我似乎无法找到一个Ansible的剧本片段,把用户”部署者“如何做到这一点?

回答

52

有时候知道该问什么,我不知道,因为我是一位开发人员,已经参与了一些DevOps的工作

显然“无密码”或NOPASSWD登录是你需要放在/ etc/sudoers文件中的东西。

我的问题的答案是Ansible: best practice for maintaining list of 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在后续运行时。是的,我能够以“部署者”的身份登录到服务器,并且无需输入密码即可运行sudo命令。

+33

请在'lineinfile:'部分的末尾添加'validate:'visudo -cf%s''这一行,以便在保存之前进行验证。搞砸sudoers文件将永久锁定你sudo的访问权限。 –

+1

自v1.9以来''key'参数'authorized_key' [接受密钥为字符串](http://docs.ansible.com/ansible/latest/authorized_key_module.html) – Tim

+1

您也可以创建/复制文件在'/ etc/sudoers.d'中,大多数发行版都默认包含这个行... –