在Linux上的子系统通过Ansible连接到Hyper-V上的Linux。(Please note that paraphrasing can lead to potential loss of information or nuances in the original sentence.)

首先

我认为为了在本地环境进行测试,需要在Hyper-V上构建环境。

使用Ansible可以轻松构建,这是众所周知的事实,但在Windows上使用时,需要通过某种方式创建虚拟机并在其上进行操作。

这次要在Windows 10中的SubSystem for Linux上的Ubuntu安装Ansible,来进行Hyper-V上的CentOS的配置管理。

准备虚拟机

如果您想在Hyper-V上复制虚拟机,请参考上一篇文章。本次,我们准备了三台机器在Hyper-V上,并同时进行全部环境的初步配置。

在Linux子系统上安装Ansible

已经假设Ubuntu的Linux子系统已经从Store中安装好。
按照Ansible官方指南执行操作。

打开终端,执行以下命令。

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
$ ansible --version
ansible 2.4.2.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.12 (default, Nov 20 2017, 18:23:56) [GCC 5.4.0 20160609]

将私钥安装到虚拟机上。

在Linux的Bash子系统中创建秘密钥匙。

$ sshkey-gen
<出てきた文言は必要に応じて入力>

将内容分发给每个虚拟机。

$ ssh-copy-id root@<仮想マシンのIPアドレス>

进行对Ansbile的操作验证

试着对每台虚拟机执行PING命令。

$ ansible <仮想マシンのIPアドレス> -m ping
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: Could not match supplied host pattern, ignoring: <仮想マシンのIPアドレス>

 [WARNING]: No hosts matched, nothing to do

根据这篇文章参考,在此执行以下配置,出现错误导致Ping无法输出。

$ mkdir ansible
$ cd ansible
$ cp /etc/ansible/ansible.cfg ./
$ vi ansible.cfg
---
#inventory      = /etc/ansible/hosts#inventory      = ./hosts
---
$ vi hosts
---
[VM]
<仮想マシンのIPアドレス>
---

当我再次执行Ansible命令时,这次出现了不同的错误。

$ ansible <仮想マシンのIPアドレス> -m ping
<仮想マシンのIPアドレス> | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
    "unreachable": true
}

通过加上调查选项执行后发现,用户名没有被正确设置。

$ ansible <仮想マシンのIPアドレス> -m ping -vvv
ansible 2.4.2.0
  config file = /ansible/ansible.cfg
  configured module search path = [u'/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.12 (default, Nov 20 2017, 18:23:56) [GCC 5.4.0 20160609]
Using /ansible/ansible.cfg as config file
Parsed /ansible/hosts inventory source with ini plugin
META: ran handlers
Using module file /usr/lib/python2.7/dist-packages/ansible/modules/system/ping.py
<仮想マシンのIPアドレス> ESTABLISH SSH CONNECTION FOR USER: None
<仮想マシンのIPアドレス> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=.ansible/cp/a843a8612c 仮想マシンのIPアドレス '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<仮想マシンのIPアドレス> (255, '', 'Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n')
<仮想マシンのIPアドレス> | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
    "unreachable": true
}

我已经按照以下方式修改了hosts文件。

<仮想マシンのIPアドレス> ansible_user=root

在这里,结果将会返还过来。

$ ansible <仮想マシンのIPアドレス> -m ping
<仮想マシンのIPアドレス> | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

如果不顺利的话,需要重新检查设置文件。
(作者在hosts文件中的ansible_user=root的=号前后加入了空格,导致无法正确解析的错误出现)

请参阅

    • Ansible 1.9以降のansible.cfgでhostfileを定義すると怒られる

 

    Failed to connect to the host via ssh: Permission denied (publickey,password) #19584
广告
将在 10 秒后关闭
bannerAds