没有密码检查的Ansible sudo命令

时间:2017-08-24 08:52:04

标签: ansible sudo

我想在完全自动化的环境中使用ansible,我无法手动输入密码。为了解决这个问题,我使用SSH公钥连接服务器,并在apt-get install *配置中将sudoers等多个命令列入白名单,因此我不需要密码来运行它们。例如sudo apt-get install git

但是,如果剧本中的become设置为True,则ansible会要求我输入不需要的密码。

  • 如何在不问密码的情况下告诉ansible以sudo身份运行命令?
  • 您是否知道在没有密码的情况下安装apt软件包的另一种方法?
  • 我应该使用另一种方法吗?

sudoers conf

myuser ALL = NOPASSWD: /usr/bin/apt-get install *

ansible

- name: install the latest version of ntpdate
  package:
    name: ntpdate
    state: latest
  become: True

生成此输出:

failed: [x.x.x.x] (item=ntpdate) => {"failed": true, "item": "python3-dev", "module_stderr": "", "module_stdout": "sudo: a password is required\r\n", "msg": "MODULE FAILURE", "rc": 1}

5 个答案:

答案 0 :(得分:1)

在我所做的所有Ansible剧本中,我只做了两件事,以便任务运行成为:真

  1. 在具有以下内容的目标主机上创建文件/etc/sudoers.d/demo

    演示ALL =(ALL)NOPASSWD:ALL

  2. 使用ssh-copy-id

  3. 将Anssh主机的ssh id复制到目标主机

答案 1 :(得分:1)

template / without_sudo

%sudo  ALL=(ALL) NOPASSWD: ALL
%sudo  ALL=(ALL) NOPASSWD: /sbin/poweroff, /sbin/reboot, /sbin/shutdown

tasks / main.yml

- name: Sudoers no password
  raw: echo '{{ user_password }}' | sudo -S sh -c 'echo "{{ lookup('file', 'templates/without_sudo') }}" > /etc/sudoers.d/without_sudo'

其余的ansible命令没有sudo

答案 2 :(得分:0)

简单的答案是,如果不启用所有命令(或至少python),则无法执行此操作。

Ansible不会按预期运行命令。它运行Python脚本。使用ansible-playbook执行-vvv时,您可以看到确切的命令。它们要复杂得多,要启用它们,您必须将它们添加到sudoers,例如:

sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-xxxxxx;
  /usr/bin/python /var/www/.ansible/tmp/ansible-tmp-xxxxxxxx/apt.py;
  rm -rf "/var/www/.ansible/tmp/ansible-tmp-xxxxxxxx/" > /dev/null 2>&1'"'"'
  && sleep 0

棘手的部分是所有空格,引号和其他特殊字符都是相关的,并且在通过反复试验获得正确的命令模式之前,用通配符替换字符,系统将不允许命令以提升的权限运行。实际上,您无法将Ansible运行的所有命令列入白名单。

唯一的例外是raw模块,它完整地运行给定命令。

答案 3 :(得分:0)

您可以将带有sudo的ansible'command'模块用作命令的一部分,而不是'become:yes'

- name: install the latest version of ntpdate
  command: 'sudo apt-get update ntpdate'

缺点是,它的可移植性较差。好处是,它的工作原理是...,您只需要将特定命令列入白名单。

答案 4 :(得分:-1)

在我看来,如果你用=(ALL)NOPASSWD:ALL设置你的节点。然后任何人:包括黑客可以访问你的节点。

所以我可以建议,

ansible-playbook <name>.yml --ask-sudo-pass

这将询问您的节点sudo密码。你可以执行你的操作,因为我猜你知道你的节点的凭证。