问题描述
在使用Ansible时遇到了困难。他有一个名为inventory.yml
的文件,内容如下:
[master]
master1 ansible_host=192.168.56.2 ansible_port=2222 ansible_user=deploy ansible_ssh_pass=vagrant ansible_become_pass=vagrant apt_key_master=https://packages.cloud.google.com/apt/doc/apt-key.gpg
[worker]
worker1 ansible_host=192.168.56.3 ansible_port=2200 ansible_user=deploy ansible_ssh_pass=vagrant ansible_become_pass=vagrant apt_key_worker=https://packages.cloud.google.com/apt/doc/apt-key.gpg
他还有一个名为kube-repos.yml
的playbook,内容如下:
- hosts: all
become: yes
tasks:
- name: add Kubernetes apt-key
apt_key:
url: "{{ apt_key_master }}"
state: present
- name: add Kubernetes' APT repository
apt_repository:
repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
state: present
当他使用ansible-playbook kube-repos.yml
命令应用playbook时,出现以下错误:
fatal: [master1]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey).", "unreachable": true}
fatal: [worker1]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey).", "unreachable": true}
用户发现问题在于Ansible无法正确进行SSH身份验证。他可以通过vagrant ssh master
和vagrant ssh worker
命令成功登录虚拟机,但是当他应用playbook并使用ansible all -m ping
命令时,出现了UNREACHABLE错误。他正在尝试搭建一个包含一个主节点和一个工作节点的简单Kubernetes集群。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
对于每个你想要Ansible工作的Vagrant虚拟机,按照以下步骤进行操作,以master1
为例:
1. 执行vagrant ssh-config > vagrant-ssh
命令。
2. 将vagrant-ssh
文件中的内容复制到你的~/.ssh/config
文件中,并根据需要进行修改。以下是一个示例,假设有一个名为master1
的机器:
Host master1
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /home/myname/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
- 在你的主机(inventory)文件中,为每台机器包含Ansible所需的登录信息。例如:
master1 ansible_host=master1 ansible_port=2222 ansible_ssh_user=vagrant ansible_ssh_pass=vagrant ansible_become_pass=vagrant
或者使用IP地址作为ansible_host
:
master1 ansible_host=192.168.56.2 ansible_port=2222 ansible_ssh_user=vagrant ansible_ssh_pass=vagrant ansible_become_pass=vagrant
方案2
请注意以下操作注意版本差异及修改前做好备份。
另一种方法是使用IP地址来指定worker1
,例如:worker1 ansible_host=192.168.56.3 ansible_port=<可能与master1不同> ansible_ssh_user=vagrant ansible_ssh_pass=vagrant ansible_become_pass=vagrant
。
请注意,如果你无法通过ssh worker1
命令连接到worker1
,可能需要为worker1
指定IP地址。