在 Ansible 丢失了 sudo 密码

Anble 从下面的代码中询问 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 是 非根用户,它没有密码,只能使用 key auth 登录。

对于用户 Postgres,这个帐户没有密码,因为数据库刚刚安装。

由于我是以 -root 用户登录的,所以当切换到 后退帐户以创建数据库用户时,它当然会要求输入密码。但是如果从 root 帐户切换到 Postgres就不需要密码了。因此,我想知道是否有一种方法可以切换到 root,然后切换到用户 Postgres

注意: 根帐户没有公钥,没有密码,并且不能从 SSH 登录。

167828 次浏览

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

如果用于建立连接的 ssh _ user 属于 sudoers 组,则不需要指定 Sudo _ user,只需说明 Sudo _ pass

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

postgres ALL=(ALL) NOPASSWD:ALL

这样可以确保 postgres 用户(如果您将其用作 sudo 用户的话)在尝试 sudo 命令时不会被要求输入密码。

如果您使用不同的用户连接到目标机器,那么您必须修改以上内容,以便将 NOPASSD 权限授予该用户。

详情请参阅 给你

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

$ ansible-playbook mail.yml -kK
SSH password:
BECOME password[defaults to SSH password]:
  • - k,—— ask-pass : 请求连接密码
  • - k,——询问-成为-通过 : 询问权限提升密码

如果你选择“启用权限提升”选项,这将发生在安赛尔塔的用户界面上。你可能需要在安赛波塔提供两次密码。

将其添加到您的/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

您可以指定 sudo 密码时,运行安赛布尔剧本:

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

我的错误信息解决方案/工作区: 错误! = > {“ msg”: “丢失 sudo 密码”}

对于我来说,虽然用户已经存在于 sudoers 文件上的远程主机执行命令而不使用密码,我仍然得到这个消息。我所做的就是进入 YAML 的主要剧本:

---


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

同样在/etc/anable/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/anable-$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'"}

在我的示例中,我将信息添加到服务器组的组变量中

因此,在/etc/anable/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/的答案

如果以上所有的解决方案都不适合你,这就是我的情况。我的问题是我的 anable _ user 没有所有的权限,我不喜欢允许 root 用户从 ssh 进行连接。

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

tester ALL= NOPASSWD:ALL     # bad

改为:

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

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

最初想要限制维护者的权限,但是在 Ansible,当所有用户使用成为 _ user 时,anable _ user 必须能够运行命令。

在我的例子中,我通过在 /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

在您的远程服务器(客户端-服务器)或(目标-服务器)中,作为 root 用户编写这个命令

视频主持人 下面

用户权限规范

< your-name on (client-server) > ALL = (ALL) NOPASSD: ALL 保存文件 现在,从 Controller-Server (工作站)或(安赛尔-服务器) ,无论您调用,运行您的命令

Ssh < your-user on (client-server) >@ipaddress 成功

在我的例子中,即使密码是正确的,我也会得到这个错误,因为 playbook 指定了“ connect: local”。剧本将连接类型设置为 local,因为所有命令都应该在 localhost 上运行。在添加了一个需要委托给远程主机的新任务之后,连接方法仍然被设置为 local,这导致了丢失 sudo 密码错误。通过删除剧本中的“连接: 本地”修复了错误。

在我的示例中,我的用户对托管节点没有 sudo 权限。默认情况下,可以设置成为 _ method: sudo 我通过指定-vvvv 并查看日志发现了这一点。

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

可能的-剧本-u-b 可能的-脚本

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

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