Learning Ansible with Vagrant
这是我很久前写的一篇博文Learning Ansible with Vagrant,希望对大家学习Ansible和Vagrant能有所帮助
介绍
Vagrant介绍
Vagrant是一款构建虚拟开发环境的工具,Vagrant的使用依赖于VirtualBox,VMware等一些虚拟机,通过Vagrant能更加方便的管理虚拟机,同时还能够通过Vagrant打包出一个开发环境,将它分发给团队成员就能够保证团队成员的开发环境一致。
Ansible介绍
Ansible是一款基于Python的自动化运维工具,集合了众多运维工具(puppet、chef)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible工作机制
Ansible在管理节点将命令通过SSH协议(或者 Kerberos、LDAP)推送到被管理节点上并执行命令。通过这种方式就能够在管理节点上控制一台或多台被管理节点执行安装软件,重启服务等命令。
搭建环境
Vagrantfile配置
首先我们需要通过Vagrant通过创建多台虚拟机,一个充当管理节点,其他充当被管理节点,同时在管理节点上需要安装上ansible。Vagrantfile文件的配置如下图所示
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}" endend# create mgmt nodeconfig.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作为被管理节点。
bootstrap-mgmt.sh内容如下所示
# !/usr/bin/env bash# install ansiblesudo apt-get install software-properties-commonsudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo apt-get install -y ansible# configure hosts filecat >> /etc/hosts http://docs.ansible.com/ansible/intro_installation.html中查看2)将每台虚拟机的ip地址和hostname写入到管理节点的hosts文件中,至于为什么要这么做,这个后面再讲### 启动接下来我们只需要在Vagrantfile所在目录的命令行中敲入vagrant up启动虚拟机即可,前提是你已经安装了vagrant了当虚拟机启动完成后,如果你是Linux或者OS X操作系统,在命令行中执行vagrant ssh mgmt就可以连接到mgmt管理节点了,如果你是windows用户,可以通过Xshell,SecureCRT等SSH客户端连接到mgmt管理节点,账号和密码默认都为vagrant。当成功连接到mgmt管理节点后,敲入ansible --version,如果ansible安装成功,显示如下### 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
SSH免密码登录配置
Ansible是通过SSH管理节点的,通过配置免密码验证可以减少Ansible每次执行操作的时候都需要进行SSH验证
在管理节点依次敲入如下命令
ssh-kengenssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@web1ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@web2
接下来通过输入命令ansible -m ping all来验证是否配置成功,如果出现如下所示,则表示成功
Ansible模块
ansible-doc
Ansible默认支持很多模块,如果想知道Ansible支持哪些模块,可以通过命令ansible-doc -l进行查看
如果想知道某一模块的具体介绍和用法,可以通过命令ansible-doc -s module_name查看
command模块的简单使用
在命令行中敲入ansible web1 -m command -a "ls /",就可以查看远程主机web1的根目录的文件情况
-m表示指定使用command模块,如果不指定,默认使用command模块
-a表示模块需要的参数
Ansible的一些常用模块可以到http://blog.csdn.net/iloveyin/article/details/46982023这篇博文中查看
Playbook
我们可以将Playbook理解为通过一定的语法格式,在YAML文件中使用Ansible模块,然后用ansible-play命令调用YAML文件实现管理远程主机。
Playbook的简单使用
在家目录下新建一个文件,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
关键字:vagrant, ansible
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!