在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