首页 文章

没有密码检查的Ansible sudo命令

提问于
浏览
2

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

但是,如果在剧本中设置 becomeTrue ,则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}

4 回答

  • 0

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

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

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

    • 使用 ssh-copy-id 将ssh id从Ansible主机复制到目标主机
  • 1

    模板/ without_sudo

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

    任务/ 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

  • 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
    

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

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

  • -1

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

    所以我可以建议,

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

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

相关问题