目录
Ansible在运维工作当中的应用... 1
一、 Ansible介绍... 2
1. 总体架构... 2
2. 特性... 2
3. 优点... 3
4. 任务执行流程... 3
二、 Ansible安装... 4
1. Python2.7安装... 4
2. 安装Ansible. 5
3. 配置免密登录... 5
三、 Ansible配置... 5
四、 常用模块使用... 6
五、 运用实例:批量安装jdk1.7. 7
六、 高级应用:Playbook介绍... 8
1. 介绍... 8
2. Rules. 9
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connectionplugins:负责和被监控端实现通信;
(2)、hostinventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
(1)、no agents:不需要在被管控主机上安装任何客户端;
(2)、no server:无服务器端,使用时直接运行命令即可;
(3)、modules inany languages:基于模块工作,可使用任意语言开发模块;
(4)、yaml,not code:使用yaml语言定制剧本playbook;
(5)、ssh bydefault:基于SSH工作;
(6)、strongmulti-tier solution:可实现多级指挥。
(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)、使用python编写,维护更简单,ruby语法过于复杂;
(4)、支持sudo。
说明:
(1)、以上内容大多是基于他人分享的基础上总结而来,学习借鉴之用;
(2)、本次安装基于CentOS 6 系统环境。
Ansible
yum -y groupinstall"Development tools"
yum -y installopenssl-devel zlib-devel ncurses-devel bzip2-devel readline-devellibtool-ltdl-devel sqlite-devel tk-devel tcl-devel wget vim lrzsz
wgethttp://python.org/ftp/python/2.7.4/Python-2.7.4.tgz
tar -xvf Python-2.7.4.tgz
cd Python-2.7.4
./configure--prefix=/usr/local/python2.7
make
make install
mv/usr/bin/python /usr/bin/python.old
ln -s/usr/local/python2.7/bin/python2.7 /usr/bin/python
vim /usr/bin/yum
将第一行的#!/usr/bin/python修改为系统原有的python版本地址#!/usr/bin/python2.6
PATH=$PATH:/usr/local/python2.7/bin
pythonez_setup.py
easy_install--version
easy_install pip
pip –version
yum -y installepel-release
yum -y installansible
主控机ssh-keygen -t rsa
这时当前用户home目录下面会生成一对密钥,id_rsa为私钥,id_rsa.pub 为公钥。
(ls /root/.ssh)
传输公钥:你要控制几台机器,就把公钥拷到几台机器上,参考如下语句
ssh-copy-id -i/root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i/root/.ssh/id_rsa.pub [email protected]
ansible all -mshell -a "sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config"
ansible all -mshell -a "reboot"
Ansible需要配置一下你要操纵的机组
vim/etc/ansible/hosts
定义方式:
定义一个主机组,把主机地址或主机名写进去,然后通过组名来调用这个组
[webservers]
192.168.14.129
192.168.14.128
……
保存后就配置完成。
Ansible语法:ansible 机组名 -m 模块 -a 执行的内容
简单测试一下:
ansiblewebservers -m ping
Ansible语法:ansible 机组名 -m 模块 -a 执行的内容
用来查看远程主机的一些基本信息
ansiblestorm_cluster -m setup
## 用来测试远程主机的运行状态
# ansiblestorm_cluster -m ping
复制文件到远程主机
示例:将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器
ansiblestorm_cluster -m copy -a "src=/etc/ansible/ansible.cfgdest=/tmp/ansible.cfg owner=root group=root mode=0644"
## 在远程主机上执行命令
相关选项如下:
ansible storm_cluster-m command -a "uptime"
## 切换到某个shell执行指定的指令,参数与command相同。
这个模块与script不同的是,首先要将写好的sh脚本分发到机组,再执行
与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw。
示例:
先在本地创建一个SHELL脚本
vim/tmp/rocketzhang_test.sh
将创建的脚本文件分发到远程
ansiblestorm_cluster -m copy -a "src=/tmp/rocketzhang_test.shdest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"
远程执行
# ansiblestorm_cluster -m shell -a "/tmp/rocketzhang_test.sh"
用script模块可以实现到对象节点上执行本机脚本。有点类似copy+shell+删除copy的脚本的这样一个综合的功能。
ansible host32-m script -a /tmp/hello.sh
其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。
service:系统服务管理
cron:计划任务管理
yum:yum软件包安装管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理
更多模块可以参考:
#ansible-doc –l
其中shell commandscript copy是我们最常用的四个模块
使用ansible给三台机器同时安装jdk1.7,并配置环境变量
前提:主控机ansible安装好,host配置好受控机,jdk1.7的rpm包下载并放在主控机上。
操作步骤如下:
ansible all -m copy -a "src=jdk-7u80-linux-x64.rpmdest=/home/ owner=root group=root mode=0755"
ansible all -m shell -a "rpm -ivh/home/jdk-7u80-linux-x64.rpm"
ansible all -m shell -a "export JAVA_HOME=/usr/java/jdk1.7.0_80/"
ansible all -m shell -a"export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ansible all -m shell -a "export PATH=$JAVA_HOME/bin:$PATH"
ansible all -m shell -a "java -version"
playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。
语法 ansible-playbookXXX.yml
Playbook剧本定义在一个yml文件中
hosts playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。
user remote_user则用于指定远程主机上的执行任务的用户。
play的主体部分是tasklist. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
任务执行过程
用于当前关注的资源发生变化时采取一定指定的操作
ansible的roles用于层次性、结构化地组织palybook。roles能够根据层次型结构自动装载变量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。
root@node1playbook]# tree roles/
roles/ \\ansible所有的信息都放到此目录下面对应的目录中
└── nginx \\角色名称
├── default \\为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件;
├── files \\存放有copy或script等模块调用的文件
├── handlers \\此目录总应当包含一个main.yml文件,用于定义各角色用到的各handler
├── meta \\应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持
├── tasks \\至少包含一个名为main.yml的文件,定义了此角色的任务列表,可使用include指令
├── templates\\template模块会自动在此目录中寻找Jinja2模板文件
└── vars \\应当包含一个main.yml文件,用于定义此角色用到的变量
将解压后配置好的tomcat包放在file下面。
定义一个playbook文件main.yml
内容如下:
保存后执行:
执行结果如下:
虽然没有报错,我们还是要检查一下tomcat是否启动成功,依然使用ansible
服务启动成功。
使用playbook编写剧本有很大的拓展空间,网络上也有丰富的资料,有需要的话应该首先在网上看有没有现成写好的playbook来用,不需要第一时间手动编写。