我有一个简单的剧本,尝试安装软件包。 我的任务失败了(参见输出)。
我可以 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 概念。
我将
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
此错误是因为 playbook 无法以 root 用户身份在远程节点上运行。 我们可以修改ansible.cfg文件来解决这个问题。 步骤:
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
注意:如果不修改 .cfg 行,则可以在剧本执行期间通过终端传递相应的值(如问题本身所指定)。
注意,如果 Ansible 控制器和节点之间没有预先建立 ssh 身份验证,则需要附加 -kK (这要求远程节点的特权用户密码),即 ansible-playbook playbookname.yml -kK 这将要求您输入 SSH 连接的密码,以及 BECOME 密码(节点上特权用户的密码)