这是我好久前写的一篇博文Learning Ansible with Vagrant,但愿对你们学习Ansible和Vagrant能有所帮助html
Vagrant是一款构建虚拟开发环境的工具,Vagrant的使用依赖于VirtualBox,VMware等一些虚拟机,经过Vagrant能更加方便的管理虚拟机,同时还可以经过Vagrant打包出一个开发环境,将它分发给团队成员就可以保证团队成员的开发环境一致。node
Ansible是一款基于Python的自动化运维工具,集合了众多运维工具(puppet、chef)的优势,实现了批量系统配置、批量程序部署、批量运行命令等功能。git
Ansible在管理节点将命令经过SSH协议(或者 Kerberos、LDAP)推送到被管理节点上并执行命令。经过这种方式就可以在管理节点上控制一台或多台被管理节点执行安装软件,重启服务等命令。github
首先咱们须要经过Vagrant经过建立多台虚拟机,一个充当管理节点,其余充当被管理节点,同时在管理节点上须要安装上ansible。Vagrantfile文件的配置以下图所示web
Vagrant.config(2) do |config| #common config config.vm.box = "ubuntu/trusty64" config.vm.provider "virtualbox" do |vb| vb.memory = "256" end # create some web server (1..2).each do |i| config.vm.define "web#{i}" do |web_config| web_config.vm.hostname = "web#{i}" web_config.vm.network "private_network", ip: "192.168.33.2#{i}" web_config.vm.network "forwarded_port", guest: 80, host: "808#{i}" end end # create mgmt node config.vm.define "mgmt" do |mgmt_config| mgmt_config.vm.hostname = "mgmt" mgmt_config.vm.network "private_network", ip: "192.168.33.11" mgmt_config.vm.provision "shell", path: "bootstrap-mgmt.sh" end end
在Vagrantfile中咱们声明了须要建立三台虚拟机,mgmt为管理节点,hostname是mgmt,ip地址为192.168.33.11
,同时安装好后会执行一段shell脚本(bootstrap-mgmt.sh)。web1,web2做为被管理节点。shell
bootstrap-mgmt.sh内容以下所示bootstrap
#!/usr/bin/env bash #install ansible sudo apt-get install software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install -y ansible #configure hosts file cat >> /etc/hosts <<EOL #vagrant env node 192.168.33.11 mgmt 192.168.33.21 web1 192.168.33.22 web2 EOL
在shell脚本中,咱们作了两件事ubuntu
1)安装ansible,这里由于咱们用的是Ubuntu操做系统,因此使用的是apt来进行安装,其余的安装方式能够在http://docs.ansible.com/ansible/intro_installation.html中查看
2)将每台虚拟机的ip地址和hostname写入到管理节点的hosts文件中,至于为何要这么作,这个后面再讲vim
接下来咱们只须要在Vagrantfile所在目录的命令行中敲入vagrant up
启动虚拟机便可,前提是你已经安装了vagrant了windows
当虚拟机启动完成后,若是你是Linux或者OS X操做系统,在命令行中执行vagrant ssh mgmt就能够链接到mgmt管理节点了,若是你是windows用户,能够经过Xshell,SecureCRT等SSH客户端链接到mgmt管理节点,帐号和密码默认都为vagrant。
当成功链接到mgmt管理节点后,敲入ansible --version
,若是ansible安装成功,显示以下
安装完ansible后咱们须要对ansible进行一些配置。接下来咱们能够到/etc/ansible
目录去copy一些配置文件到当前用户(也就是vagrant)的家目录下cp -r /etc/ansible/* ~
,接下来咱们到用户的家目录中打ansible.cfg
,也就是Ansible的配置文件
在ansible.cfg
的开头咱们可能看到这么一段注释,以下所示
这段注释表达的意思是,若是当前用户的家目录下存在ansible.cfg
,则会优先加载,若是没有才去加载/etc/ansible/ansible.cfg
。若是这时候咱们在家目录下敲入ansible --version
,就会发现配置文件的路径指向的是/home/vagrant/ansible.cfg
编辑ansible.cfg
,将inventory
指向家目录下的hosts
文件
以后修改家目录下的hosts文件,修改成以下所示
[web]
表示一个组,组名为web
,组成员为web1
、web2
。
为何组成员是web1
、web2
呢?
还记得以前咱们在bootstrap-mgmt.sh
中写的shell脚本吗?咱们在shell脚本中将主机ip和主机hostname都写入到了管理节点的hosts文件中
#configure hosts file cat >> /etc/hosts <<EOL #vagrant env node 192.168.33.11 mgmt 192.168.33.21 web1 192.168.33.22 web2 EOL
固然也能够将ansible的hosts配置成以下所示,这样就不用配置主机的hosts文件
Ansible是经过SSH管理节点的,经过配置免密码验证能够减小Ansible每次执行操做的时候都须要进行SSH验证
在管理节点依次敲入以下命令
ssh-kengen ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@web1 ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@web2
接下来经过输入命令ansible -m ping all
来验证是否配置成功,若是出现以下所示,则表示成功
Ansible默认支持不少模块,若是想知道Ansible支持哪些模块,能够经过命令ansible-doc -l
进行查看
若是想知道某一模块的具体介绍和用法,能够经过命令ansible-doc -s module_name
查看
在命令行中敲入ansible web1 -m command -a "ls /"
,就能够查看远程主机web1的根目录的文件状况
-m
表示指定使用command模块,若是不指定,默认使用command模块
-a
表示模块须要的参数
Ansible的一些经常使用模块能够到http://blog.csdn.net/iloveyin/article/details/46982023这篇博文中查看
咱们能够将Playbook理解为经过必定的语法格式,在YAML文件中使用Ansible模块,而后用ansible-play命令调用YAML文件实现管理远程主机。
在家目录下新建一个文件,vim demo.yml
,在文件中写入
- hosts: web1 tasks: # task名字 - name: do somethings # 使用shell模块 shell: 'echo 123 > /home/vagrant/demo.txt'
接下来,在命令行中敲入ansible-playbook demo.yml
,这样就至关于执行了ansible web1 -m shell -a 'echo 123 > /home/vagrant/demo.txt'
,接着在命令行中执行ansible web1 -m shell -a 'cat /home/vagrant/demo.txt'
,能够看到确实是将123写入到了demo.txt中
Playbook的详细使用方法能够到官方文档中查看http://docs.ansible.com/ansible/playbooks.html。若是英文不太好,能够到国人翻译的中文文档中查看http://www.ansible.com.cn/。固然你也能够结合文档和官方提供的例子https://github.com/ansible/ansible-examples学习ansible