此命令必须在root用户下运行。但我只是root

问题描述 投票:0回答:2

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

我可以 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,不知道我在这里做错了什么。

提前致谢。

ansible root rhel
2个回答
2
投票

修好了。 但是,我需要更好地理解 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: tco
become_user:root


1
投票

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

  1. 打开ansible.cfg,默认命令是:sudo vim /etc/ansible/ansible.cfg
  2. 搜索正则表达式:/privilege_escalation(/基本上是在VIM中搜索后面的关键字)
  3. 按 I(插入模式),取消注释以下行:
    [privilege_escalation]
    become=True
    become_method=sudo
    become_user=root
    become_ask_pass=False

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

  1. 使用以下命令再次运行 playbook:ansible-playbook playbookname.yml

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

© www.soinside.com 2019 - 2024. All rights reserved.