无需密码检查的Ansible sudo命令

无需密码检查的Ansible sudo命令,ansible,sudo,Ansible,Sudo,我想在一个完全自动化的环境中使用ansible,在这里我不能手动键入密码。为了解决这个问题,我使用SSH公钥连接服务器,并在我的sudoers配置中列出了一些命令,例如apt get install*,因此我不需要密码来运行它们。例如sudo apt get install git 但是,如果剧本中的设置been为True,ansible会要求我输入它不需要的密码 我如何告诉ansible以sudo的身份运行命令,而不询问密码 你知道另一种不用密码安装apt软件包的方法吗 我应该使用另一种方法

我想在一个完全自动化的环境中使用ansible,在这里我不能手动键入密码。为了解决这个问题,我使用SSH公钥连接服务器,并在我的
sudoers
配置中列出了一些命令,例如
apt get install*
,因此我不需要密码来运行它们。例如
sudo apt get install git

但是,如果剧本中的设置
been
True
,ansible会要求我输入它不需要的密码

  • 我如何告诉ansible以sudo的身份运行命令,而不询问密码
  • 你知道另一种不用密码安装apt软件包的方法吗
  • 我应该使用另一种方法吗
苏多尔形态 安西布尔 生成此输出:

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}

简单的答案是,如果不启用所有命令(或者至少
python
),就无法完成此任务

Ansible不会按预期运行命令。它运行Python脚本。使用
-vvv
执行
ansible playbook
时,您可以看到确切的命令。它们要复杂得多,要启用它们,您必须将它们添加到
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
棘手的是,所有空格、引号和其他特殊字符都是相关的,除非您通过反复试验获得正确的命令模式,用通配符替换字符,否则系统将不允许命令以提升的权限运行。实际上,您将无法将所有命令列为白名单


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

在我编写的所有Ansible剧本中,我只需做两件事,就可以让任务运行:True

  • 使用以下内容在目标主机上创建文件
    /etc/sudoers.d/demo

    演示全部=(全部)NOPASSWD:ALL

  • 使用
    ssh Copy id


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

    所以我可以建议

    ansible-playbook <name>.yml --ask-sudo-pass
    
    ansible playbook.yml——询问sudo pass
    
    这将询问您的节点sudo密码。而且你可以执行你的操作,因为我想你知道你节点的凭证。

    模板/没有_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

    您可以将ansible“command”模块与sudo一起用作命令的一部分,而不是“been:yes”

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

    缺点是它的便携性要差得多。好的一面是,它能起作用。。。您只需将特定命令列为白名单。

    我通常的做法是让一个用户拥有无密码的sudo访问权限。这就是我在
    sudoers
    文件中所做的,不过ansible会向我索要密码。好的。您是否能够在不指定密码的情况下使用该用户通过ssh连接到目标主机?到目前为止是否有任何解决方案?我可以通过将ansible uses命令添加到sudoers异常中来接受这一点。然而,问题是ansible在运行任何sudo命令之前都会检查密码,不管该命令是什么:
    sudo-H-S-n-u root/bin/sh-c''echo-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
    ,我也希望避免使用
    raw
    ,因为ansible的目的是自动化一切:)不,它不询问,但它抱怨没有根密码,然后退出。请参阅主要问题中的ansible输出。@azmeuk,因为您没有添加ansible试图运行的确切命令。尝试使用通配符而不是空格、引号等。您在
    sudoers
    中输入的内容对所有这些都很敏感。这就是我所说的写作,它实际上是不可能的。
    - name: Sudoers no password
      raw: echo '{{ user_password }}' | sudo -S sh -c 'echo "{{ lookup('file', 'templates/without_sudo') }}" > /etc/sudoers.d/without_sudo'
    
    - name: install the latest version of ntpdate
      command: 'sudo apt-get update ntpdate'