【问题标题】:Missing sudo password in AnsibleAnsible 中缺少 sudo 密码
【发布时间】:2014-08-30 13:11:58
【问题描述】:

Ansible 从以下代码中询问 sudo 密码,它尝试创建一个新的 postgres 用户。

错误信息:

致命:[xxx.xxx.xxx.xxx] => 缺少 sudo 密码

main.yml

- name: 'Provision a PostgreSQL server'
  hosts: "dbservers"
  sudo: yes
  sudo_user: postgres
  roles:
    - postgres

create_db.yml

- name: Make sure the PostgreSQL users are present
  postgresql_user: name=rails password=secret role_attr_flags=CREATEDB,NOSUPERUSER
  sudo_user: postgres
  sudo: yes

登录本机的remote_user是非root用户,没有密码,只能使用key auth登录。

对于用户postgres,此帐户也没有密码,因为数据库刚刚安装。

由于我是作为-root用户登录的,当然在切换到postgress帐户时会要求输入密码以创建数据库用户。但如果从 root 帐户切换到 postgres,则不需要密码。所以,不知道有没有办法切换到root,然后切换到用户postgres

注意:root账号没有公钥,没有密码,不能SSH登录。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    尝试使用选项-kK。它会提示输入密码。

    $ ansible-playbook mail.yml -kK 
    SSH password: 
    BECOME password[defaults to SSH password]: 
    
    • -k, --ask-pass:询问连接密码
    • -K, --ask-become-pass:要求提权密码

    【讨论】:

    • 或长--ask-become-pass
    • 我有一个将身份验证与 ssh_private_key 和密码身份验证相结合的清单。我得到了这个输出,我只需要输入BECOME password[defaults to SSH password]:
    • 这是 IMO 的最佳答案。无需修改 sudoers 文件是一大优点。
    【解决方案2】:

    您可以在运行 Ansible playbook 时指定 sudo 密码:

    ansible-playbook playbook.yml -i inventory.ini --extra-vars "ansible_sudo_pass=yourPassword"
    

    【讨论】:

    • 把你的 sudo 密码放在命令行不是一个好主意
    • 你可以在ansible.cfg中设置为True "become_ask_pass",系统会提示。或者,如果您想完全自动化,请使用例如 Ansible Vault 来避免这种情况,将成为的密码保存在加密文件中,只需添加 --ask-vault-pass (或其他一些机制,作为保存保管库密码本身在您的主目录的隐藏文件中,访问权限仅供您使用)...
    【解决方案3】:

    在目标机器上的/etc/sudoers.d 目录中添加一个名为 postgres 的文件,其内容如下:

    postgres ALL=(ALL) NOPASSWD:ALL
    

    这可确保 postgres 用户(假设您将其用作 sudo 用户)在尝试 sudo 命令时不会被要求输入密码。

    如果您使用不同的用户连接到目标计算机,那么您必须修改上述内容,改为将 NOPASSWD 权限授予该用户。

    更多详情请参阅here

    【讨论】:

    • 在我的场景中,同样在 sudoers 中添加用户不起作用,仍然问我密码,我觉得这很奇怪。我正在使用:ansible 2.9.6 配置文件 = /etc/ansible/ansible.cfg 配置的模块搜索路径 = ['/home/myuser/.ansible/plugins/modules', '/usr/share/ansible/plugins/ modules'] ansible python模块位置= /usr/lib/python3/dist-packages/ansible可执行位置= /usr/bin/ansible python版本= 3.8.2(默认,2020年7月16日,14:00:26)[GCC 9.3.0]
    • 我认为有比添加 NOPASSWD 更多(更安全)的方法(这可能违反某些组织的安全策略):您可以在 ansible.cfg 中设置为 True "become_ask_pass",然后系统会提示。或者,如果你想完全自动化它,使用例如 Ansible Vault 来避免这种情况,将成为密码保存在加密文件中,只需添加 --ask-vault-pass 或其他一些机制,作为保存保管库密码本身在您的主目录的隐藏文件中,仅对 Ansible 成为用户具有访问权限...
    【解决方案4】:

    您需要修改/etc/sudoers 文件或命令visudo 以允许您连接到删除服务器的用户在没有密码提示的情况下切换到另一个用户。

    【讨论】:

    • 我使用的是 supervisorctl 模块,我的/etc/sudoers 文件被配置为允许我在没有密码的情况下运行sudo supervisorctl。 ansible 执行它的方式,这还不够,您需要能够更改用户。我的解决方法是在没有任何模块支持的情况下直接运行command: sudo supervisorctl ...
    • 我认为还有更多(更安全)的方法:你可以在ansible.cfg中设置为True“become_ask_pass”,系统会提示。或者,如果你想完全自动化它,使用例如 Ansible Vault 来避免这种情况,将成为密码保存在加密文件中,只需添加 --ask-vault-pass 或其他一些机制,作为保存保管库密码本身在您的主目录的隐藏文件中,仅对 Ansible 成为用户具有访问权限...
    【解决方案5】:

    就我而言,我将信息添加到服务器组的组变量中

    所以在 /etc/ansible/group_vars/{servergroup}/vars

    我加了

    ansible_become: yes 
    ansible_become_method: sudo
    ansible_become_pass: "{{ vault_ansible_password }}"
    

    这篇文章帮助我锻炼了答案https://www.cyberciti.biz/faq/how-to-set-and-use-sudo-password-for-ansible-vault/

    【讨论】:

      【解决方案6】:

      如果上述所有解决方案都不适合您,我就是这样。我的问题是我的 ansible_user 没有所有权限,我不想让 root 从 ssh 连接。

      但我的测试用户没有执行某些操作的所有 sudo 权限: 初始 tester_user 权限:

      tester ALL= NOPASSWD:ALL     # bad
      

      改为:

      tester ALL=(ALL:ALL) NOPASSWD:ALL    # good
      

      这些附加字段的含义是: 第一个“ALL”表示用户可以作为所有用户运行命令。 第二个“ALL”表示用户可以作为所有组运行命令。

      最初想限制维护者的权限,但由于所有用户在 Ansible 中使用 become_user,ansible_user 必须可以运行命令。

      【讨论】:

        【解决方案7】:

        将此添加到您的 /etc/sudoers 文件中

        ## Allows people in group wheel to run all commands
        %wheel  ALL=(ALL)       ALL
        
        ## Same thing without a password
        # %wheel        ALL=(ALL)       NOPASSWD: ALL
        username-u-want-to-allow        ALL=(ALL)       NOPASSWD: ALL
        

        【讨论】:

          【解决方案8】:

          如果您选择“启用权限提升”选项,这将在 Ansible Tower UI 中发生。您可能需要在 Ansible Tower 中提供两次密码。

          【讨论】:

            【解决方案9】:

            在您的远程服务器(客户端-服务器)或(目标服务器)中,无论您调用什么,以 root 用户身份编写此命令

            visudo pressenter 下

            用户权限规范

            ALL=(ALL) NOPASSWD: ALL 保存存档 现在从您的 Controller-Server(工作站)或(Ansible-Server)无论您调用什么,运行您的命令

            ssh @ipaddress 成功

            【讨论】:

              【解决方案10】:

              我的错误消息解决方案/解决方法: 致命的:[节点]:失败! => {"msg": "缺少 sudo 密码"}

              对我来说,尽管用户已经存在于远程主机上的 sudoers 文件中,可以在不使用密码的情况下执行命令,但我仍然收到此消息。我在主 YAML 剧本中输入的内容:

              ---
              
              - hosts: [your targeted inventory list of hosts]
                become_user: [your remote privileged user]
                become: true
                roles:
                - [your playbook role]
              

              我还在 /etc/ansible/ansible.cfg 中启用/注释掉或更改了以下内容:

              [privilege_escalation]
              become=True
              become_method=sudo
              become_user=root
              become_ask_pass=False
              
              [defaults]
              remote_tmp = /tmp/ansible-$USER
              host_key_checking = False
              sudo_user      = [your remote privileged user]
              ask_sudo_pass = False
              ask_pass      = False
              

              remote_tmp = /tmp/ansible-$USER 条目是为了避免出现以下消息:

              OSError: [Errno 13] Permission denied: '/etc/.ansible_tmpLyoZOOyum.conf'
              fatal: [node]: FAILED! => {"changed": false, "msg": "The destination directory (/etc) is not writable by the current user. Error was: [Errno 13] Permission denied: '/etc/.ansible_tmpLyoZOOyum.conf'"}
              

              【讨论】:

                【解决方案11】:

                在我的情况下,我通过在/etc/sudoers 的行中添加命令/bin/sh 来解决它,以允许在没有密码的情况下执行命令。

                这是显示的错误:

                BECOME password: 
                debian | FAILED! => {
                    "ansible_facts": {
                        "discovered_interpreter_python": "/usr/bin/python"
                    },
                    "changed": false,
                    "module_stderr": "Shared connection to debian9 closed.\r\n",
                    "module_stdout": "\r\n",
                    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
                    "rc": 1
                }
                

                只添加这个:

                user    ALL= NOPASSWD: /usr/bin/id, /usr/bin/whoami, /bin/sh
                

                出于测试目的,我还添加了idwhoami

                【讨论】:

                  【解决方案12】:

                  在我的情况下,即使密码正确,我也会收到此错误,因为 playbook 指定了“连接:本地”。该剧本将连接类型设置为本地,因为所有命令都应该在本地主机上运行。添加需要委托到远程主机的新任务后,连接方法仍设置为本地,导致缺少 sudo 密码错误。该错误已通过删除 playbook 中的“连接:本地”得到修复。

                  【讨论】:

                    【解决方案13】:

                    就我而言,我的用户在受管节点上没有 sudo 权限。默认情况下,ansible 设置了 become_method: sudo 我通过指定 -vvvv 并查看日志发现了这一点。

                    ...
                    remote_user: username
                    become_method: sudo
                    inventory: (u'/etc/ansible/hosts',)
                    ...
                    

                    ansible-playbook -u -b ansible-script.yml -vvvv

                    为了解决这个问题,我在 ansible 脚本中指定了“成为否”。 例如:

                    - name: Ensure the httpd service is running
                      service:
                        name: httpd
                        state: started
                      become: no
                    

                    【讨论】:

                      【解决方案14】:

                      如果您用于建立连接的 ssh_user 属于 sudoers 组,则无需指定 sudo_user,只需说出 sudo_pass。 p>

                      【讨论】:

                        猜你喜欢
                        • 2016-02-24
                        • 2020-12-20
                        • 2016-09-22
                        • 2014-03-19
                        • 2019-01-14
                        • 2018-10-17
                        • 2016-11-11
                        • 2020-11-13
                        相关资源
                        最近更新 更多