Ansible playbook无法应用,出现主机不可达错误

88次阅读
没有评论

问题描述

在使用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 mastervagrant 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
  1. 在你的主机(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地址。

正文完