【问题标题】:This command has to be run under the root user. But I am root only此命令必须在 root 用户下运行。但我只是root
【发布时间】:2021-10-28 20:27:51
【问题描述】:

我有一个尝试安装软件包的简单剧本。 我的任务失败了(见输出)。

我可以ping主机,手动可以超级用户(tco)运行命令。

我的ansible.cfg

[defaults]
inventory = /Users/<myuser>/<automation>/ansible/inventory
remote_user = tco

packages

packages:
  - yum-utils
  - sshpass

playbook

---
- hosts: all
  vars_files:
    - vars/packages.yml
  tasks:
    - name: testing connection
      ping:
      remote_user: tco

    - name: Installing packages
      yum:
        name: "{{ packages }}"
        state: present

运行剧本: ansible-playbook my-playbook.yml --limit master --become --ask-become-pass --become-user=tco --become-method=sudo

输出:

ansible-playbook register_sys_rh.yml --limit master --become --ask-become-pass --become-user=tco --become-method=sudo
BECOME password: 

PLAY [all] ******************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [xx.xxx.13.105]

TASK [testing connection] ***************************************************************************************************************************************************
ok: [xx.xxx.13.105]

TASK [Installing packages] **************************************************************************************************************************************************
fatal: [xx.xxx.13.105]: FAILED! => {"changed": false, "msg": "This command has to be run under the root user.", "results": []}

PLAY RECAP ******************************************************************************************************************************************************************
xx.xxx.13.105              : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

库存:

ansible-inventory --list | jq '.master'
{
  "hosts": [
    "xx.xxx.13.105"
  ]
}

我已将我的id_rsa.pub 复制到主机。没有密码我无法登录主机。 我可以登录并执行sudo su 或运行任何其他需要root 权限的命令。

[tco@control-plane-0 ~]$ whoami
tco
[tco@control-plane-0 ~]$ hostname -I
xx.xxx.13.105 192.168.122.1 
[tco@control-plane-0 ~]$ sudo su
[sudo] password for tco: 
[root@control-plane-0 tco]# 

我通过 ansible_cli 显式覆盖用户 sudo_method,不知道我在这里做错了什么。

提前致谢。

【问题讨论】:

  • 您已将 ssh 密钥复制到授权主机,但它不起作用?验证 ~/.ssh/* .... chmod 0600 ~/.ssh/* 和 sii 的权限,如果您可以使用密钥登录。如果没有,请尝试 ssh -vvv abd 查看调试输出,看看有什么不工作
  • --become-user=root,这是默认值,因此您可以简化省略它。 docs.ansible.com/ansible/latest/user_guide/become.html
  • 是的,我想明确地覆盖这就是我提供所有这些标志的原因。
  • 命令行值的precedence 比所有其他可以定义变量的位置最低(除了具有最高优先级的额外变量)。此外,请注意变量名称,因为您的自动答案包含多个拼写错误。您可以阅读:docs.ansible.com/ansible/latest/user_guide/become.html
  • 我从 cfg 中删除了所有内容并通过命令行传递了所有内容,如下所示:ansible-playbook main.yml -i scripts/inventory --become-user=tco --become -K --become-method=sudo 并仅输入tco 用户的密码并得到相同的错误This command has to be run under the root user

标签: ansible root rhel


【解决方案1】:

修复它。 但是,我需要更好地理解 Ansible 的概念。

我把ansible.cfg改成了这个(把become_user改成了root

[defaults]
inventory = <my-inventory-path>
remote_user = tco

[privilege_escalation]
become=True
become_method=sudo
become_ask_pass=False
become_user=root
become_pass=<password>

并且,像这样运行它:

ansible-playbook my-playbook.yml --limit master 这给了我一个错误:

FAILED! => {"msg": "Missing sudo password"}

所以,我是这样跑的:

ansible-playbook my-playbook.yml --limit master --ask-become-pass 当提示输入密码时,我提供tco 密码,不确定root 用户的密码是什么。

这行得通。

不确定为什么 cfg 文件密码不起作用,即使我在提示时提供了相同的密码。

据我了解,当我说 become_user 和 become_pass 时,这就是 ansible 用来运行特权命令的方式。但是,这里我说的是remote_user: tcobecome_user:root

【讨论】:

  • become_user 是ansible需要sudo到的账户(默认是root,所以可以省略)become_pass不存在,变量名为ansible_become_passremote_user 是 ansible 通过 ssh 连接的帐户,在您的情况下是 tco,所以在 ssh 后,当 ansible 执行 excalation 时,它需要 tco 帐户密码,因此这是进入 ansible_become_pass 的密码跨度>
  • => become_password
  • 这解释了为什么我必须手动输入密码
【解决方案2】:

此错误是因为 playbook 无法以 root 用户身份在远程节点上运行。 我们可以修改 ansible.cfg 文件来解决这个问题。 步骤:

  1. 打开ansible.cfg,默认命令为:sudo vim /etc/ansible/ansible.cfg

  2. 搜索正则表达式:/privilege_escalation(/基本上是在搜索VIM后面的关键字)

  3. 按 I(插入模式),取消注释以下行:

    [特权升级] 变成=真 become_method=sudo 成为_user=root become_ask_pass=假

注意:如果 .cfg 行没有被修改,相应的值可以在 playbook 执行期间通过终端传递(如问题本身所指定)。

  1. 再次运行 playbook:ansible-playbook playbookname.yml

注意,如果 Ansible 控制器和节点之间没有预先建立 ssh 身份验证,则需要附加 -kK(这要求远程节点的特权用户密码),即 ansible-playbook playbookname.yml -kK 这将要求您输入 SSH 连接的密码,以及 BECOME 密码(节点上的特权用户的密码)

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 2021-05-28
    • 1970-01-01
    • 2015-12-13
    • 2015-10-21
    • 2015-07-07
    • 2016-02-23
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多