[Ansible] 在使用 Vagrant 创建的虚拟机上尝试使用Ansible的备忘录
我试着使用了被评为与Chef和Puppet相比更易于使用的Ansible,并将其作为建立环境的步骤做备忘录,以免遗忘。由于我对环境搭建的理解仍然不完全,如果有错误或不准确之处,请指正。
环境
-
- OS(ホスト):CentOS 6.5
- OS(VM):CentOS 6.5
建立虚拟机环境
为了能够方便地构建和摧毁试验Ansible的环境,我们选择使用虚拟机作为节点。另外,由于直接使用VirtualBox比较麻烦,所以我们会使用经常被使用的Vagrant来简化处理VirtualBox以构建虚拟机。通过使用Vagrant,我们可以通过简单的操作来构建虚拟机,相比直接使用VirtualBox更加简便。
安装Vagrant
提供Vagrant安装步骤指南。
-
- 确认最新版本的rpm的URL
-
- 从Vagrant官方网站上确认最新版本的Vagrant包的URL。我安装Vagrant时的包的最新版本是https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm。
安装
使用yum安装刚刚确认的最新版本的Vagrant。
$ yum install https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm
确认Vagrant已经安装
确认Vagrant已经安装。
在这里,我们执行了一个命令来确认Vagrant的版本。
$ vagrant version
已安装版本:1.7.2
虚拟机环境的设置
使用以下步骤配置作为Ansible管理对象的VM环境。
-
- 创建工作目录
-
- 创建用于执行Ansible的工作目录。
$ cd ~/
$ mkdir ansible
$ cd ansible
初始化Vagrant
初始化Vagrant并创建Vagrantfile环境配置文件。
在名称中指定了一个特定的名称(可选),用于指定要使用的box的名称。
在box中指定了Vagrant所需的虚拟机模板(box文件)。
$ vagrant init [名称] [box]
如果您想使用CentOS 6.5作为VM环境,可以使用以下命令。名称可以随意设置,但在这个例子中,我们将它设置为centos6.5_ansible。
$ vagrant init centos6.5_ansible http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
编辑Vagrantfile
我们对Vagrantfile进行了编辑,以便启动3个VM。
$ cp Vagrantfile Vagrantfile.orig
$ diff Vagrantfile
15c15,29
< config.vm.box = “centos6.5_ansible” — > config.vm.define :node1 do |node|
> node.vm.box = “centos6.5_ansible”
> node.vm.network :private_network, ip: “192.168.100.10”
> end
>
> config.vm.define :node2 do |node|
> node.vm.box = “centos6.5_ansible”
> node.vm.network :private_network, ip: “192.168.100.11”
> end
>
> config.vm.define :node3 do |node|
> node.vm.box = “centos6.5_ansible”
> node.vm.network :private_network, ip: “192.168.100.12”
> end
虚拟机的启动 jī de
启动虚拟机。
$ vagrant up
让我们确认一下虚拟机已成功启动。
$ vagrant status
Current machine states:
node1 running (virtualbox)
node2 running (virtualbox)
node3 running (virtualbox)
既经确认了VM已经成功启动,现在我们尝试登录到VM上。由于当前无法直接使用ssh命令登录到Vagrant搭建的VM,因此需要使用vagrant命令中的ssh进行登录。
$ vagrant ssh node1
(vagrantで作成した仮想マシン)
尝试使用Ansible
因为已经准备好了使用Ansible的虚拟机环境,所以让我们试着使用Ansible吧。
安装 Ansible
安装Ansible可以使用yum命令来进行。
$ yum install ansible
设定Ansible管理的节点
只需提供一种选择,将以下内容用汉语本地化:
-
- 创建hosts文件
-
- Ansible有一个称为Inventory文件的东西,用于列举Ansible所管理的节点。在这里,我们将创建一个名为hosts的Inventory文件。
$ cd ~/ansible
$ touch hosts
现在,我们来看一下刚刚创建的hosts文件的内容。
[ansible-nodes]
192.168.100.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/node1/virtualbox/private_key
192.168.100.11 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/node2/virtualbox/private_key
192.168.100.12 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/node3/virtualbox/private_key
这次,我们将刚刚创建的3台虚拟机指定为ansible-nodes组。有很多文章指定将私钥指定为ansible_ssh_private_key_file为~/.vagrant.d/insecure_private_key,但是需要注意在接下来的使用Ansible进行ping命令的操作中,如果使用比较新的Vagrant版本可能会出现Permission Denied错误。
此外,我不知道原因,但在第一个字段中必须直接写入IP地址,而不是主机名。如果写入主机名会导致Permission Denied错误。(参考:Vagrant 1.7+ SSH连接错误解决方法)
设置能够直接通过ssh命令登录
正如前面所述,目前只能通过vagrant ssh命令登录到由Vagrant搭建的虚拟机。这非常麻烦,所以我们要设置能够通过ssh命令直接登录。
$ cp ~/.ssh/config ~/.ssh/config.orig
$ vagrant ssh-config > ~/.ssh/config
通过执行Ansible来进行验证操作
请用中文翻译以下内容,只需要给出一个选项:
“I enjoy playing basketball with my friends in the park.”
-
- 执行ping命令
-
- 为了确认Ansible的操作,我们尝试执行ping命令。
$ ansible -i hosts ansible-nodes -m ping
192.168.100.10 | 成功 >> {
“changed”: false,
“ping”: “pong”
}
192.168.100.11 | 成功 >> {
“changed”: false,
“ping”: “pong”
}
192.168.100.12 | 成功 >> {
“changed”: false,
“ping”: “pong”
}
确认所需安装未安装
趁机使用Ansible尝试安装一些东西。
由于我搭建的VM上没有安装gcc和gdb,所以我决定安装它们。
首先在每个VM上确认gcc和gdb均未安装。
$ ssh node1
$ which gcc
/usr/bin/which: 未找到 gcc(不在/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin中)
$ which gdb
/usr/bin/which: 未找到 gdb(不在/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin中)
$ ssh node2
$ which gcc
/usr/bin/which: 未找到 gcc(不在/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin中)
$ which gdb
/usr/bin/which: 未找到 gdb(不在/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin中)
$ ssh node3
$ which gcc
/usr/bin/which: 未找到 gcc(不在/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin中)
$ which gdb
/usr/bin/which: 未找到 gdb(不在/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin中)
创建Playbook
Ansible有一个称为Playbook的类似于Chef的配方的东西。
在Playbook中,我们会描述在目标机器上要执行的操作。
这次我们要安装gcc和gdb,所以我创建了一个名为playbook.yml的Playbook,内容如下。
—
– hosts: ansible-nodes
sudo: yes
tasks:
– name: install gcc
yum: name=gcc state=installed
– name: install gdb
yum: name=gdb state=installed
使用Ansible进行安装
使用创建的Playbook,尝试进行gcc和gdb的安装。
$ ansible-playbook -i hosts playbook.yml
PLAY [ansible-nodes] **********************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]
ok: [192.168.100.10]
TASK: [install gcc] ***********************************************************
changed: [192.168.100.11]
changed: [192.168.100.10]
changed: [192.168.100.12]
TASK: [install gdb] ***********************************************************
changed: [192.168.100.10]
changed: [192.168.100.11]
changed: [192.168.100.12]
PLAY RECAP ********************************************************************
192.168.100.10 : ok=3 changed=2 unreachable=0 failed=0
192.168.100.11 : ok=3 changed=2 unreachable=0 failed=0
192.168.100.12 : ok=3 changed=2 unreachable=0 failed=0
确认安装情况
确认gcc和gdb是否成功安装。
$ ssh node1
$ which gcc
/usr/bin/gcc
$ which gdb
/usr/bin/gdb
$ ssh node2
$ which gcc
/usr/bin/gcc
$ which gdb
/usr/bin/gdb
$ ssh node3
$ which gcc
/usr/bin/gcc
$ which gdb
/usr/bin/gdb
确认Playbook中指定的gcc和gdb已经成功安装。
整理善後事務
使用Vagrant可以很快地摧毁最后一次使用的环境。
-
- 停止虚拟机
$ vagrant halt
删除虚拟机
$ vagrant destroy
最后
我在使用Vagrant搭建的虚拟机上尝试使用Ansible配置管理工具来安装软件。
通过这个例子,可以看出Ansible的配置非常容易理解。
虽然我不清楚Ansible可以做到什么程度,但对于想要快速完成环境部署的人来说,考虑使用它是非常值得的。
除了进一步探索Ansible的功能,我还想尝试使用Chef和Puppet来验证它们的使用感受。
参考资料
-
- Ansible チュートリアル
-
- CentOSにVagrantをインストールする
-
- VagrantとDockerとAnsibleで環境自動構築!(全編:vagranとAnsible編)
-
- 不思議の国のAnsible – 第1話 –
-
- Vagrant ssh-configでvagrant sshを快適にする
-
- Vagrant 1.7+でSSH接続エラーが出た場合の対処
-
- VirtualBoxとVagrantで開発環境を構築
- AnsibleでDockerのコンテナを構築する