一、Ansible简介
1、ansible是一款非常轻量级的服务器集中管理软件,它默认采用SSH的方式去管理客户端,也就是省略了客户端程序,这比起很多需要安装客户端程序的软件来说很让人喜欢,我们可以用它的各种模块来实现对客户端的批量管理(执行命令/安装软件/指定计划任务等),对于一些较为复杂的需要重复执行的任务我们可以通过ansible一个叫做playbook的来管理这些任务,在playbook中我们可以使用变量.
2、命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args] -m module:默认为command ansible-doc: Show Ansible module documentation -l, --list List available modules -s, --snippet Show playbook snippet for specified module(s)
3、无密码登录:ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。
4、规划:
ansible:IP:172.16.12.1 hostname:ansible
node1: IP:172.16.12.101 hostname:node1
node1: IP:172.16.12.102 hostname:node2
二、安装ansible
在ansible上安装ansible
解决依赖关系
[root@ansible yum.repos.d]# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
注意:python-jinja2在centos的第二张光盘上
安装ansible-1.5.4-1.el6.noarch.rpm
[root@ansible ~]# rpm -ivh ansible-1.5.4-1.el6.noarch.rpm
三、配置ansible
1、编辑/etc/ansible/hosts(节点配置文件):
[root@ansible ~]# vim /etc/ansible/hosts //先执行:,%s/\(^[^[:space:]#]\)/#\1/g将其它行全部注释掉 //在最下方添加如下内容 [hanodes] node1.test.com node2.test.com
2、为节点服务器添加本地hosts域名解析
[root@ansible ~]# vim /etc/hosts //添加如下内容 172.16.12.101 node2.test.com 172.16.12.102 node1.test.com
3、基于秘钥配置无密码登录,方便管理各节点
[root@ansible ~]# ssh-keygen -t rsa -P ''
将公钥传到各节点服务器
[root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] [root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
四、ansible简单测试
1、查看各个节点的时间
[root@ansible ~]# ansible all -a date [root@ansible ~]# ansible all -m command -a date //以上两条命令结果是一样的,因为默认调用 command 模块,所以可以省略, all 表示所有节点, -a 后面是参数
2、查看各个节点在线情况
[root@ansible ~]# ansible all -m ping
3、在各个节点输出指定信息
[root@ansible ~]# ansible all -a "/bin/echo hello"
五、ansible-playbook
1、Playbook是通过yaml文件来配置实现的
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy dt Net与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
其特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
更多的内容及规范参见http://www.yaml.org。
2、,先来介绍下yaml语法!
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、 标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence) 里的项用"-"来代表,Map里的键值对用":"分隔。
下面是一个示例:
name: John Smith age: 41 gender: Male spouse: name: Jane Smith age: 37 gender: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
YAML文件扩展名通常为.yaml,如example.yaml
3、Playbook可以用来管理复杂任务
对于需反复执行的、较为复杂的任务,我们可以通过定义 Playbook 来搞定。Playbook 是 Ansible 真正强大的地方,它允许使用变量、条件、循环、以及模板,也能通过角色 及包含指令来重用既有内容。下面我们来看看一些具体的实例。
大家可以用 "ansible-doc -l" 命令来查看它内置的有哪些模块。 然后利用"ansible-doc 模块名" 命令来查看具体模块的详细用法。
①、通过定义安装php:
建立php.yaml文件
内容如下:
[root@ansible ~]# vim /root/php.yaml - hosts: hanodes //指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组 remote_user: root //用于指定远程主机上的执行任务的用户 tasks: //任务 - name: php installing // 给这个任务起的名字 yum: name=php state=present //name=*:利用yum模块,安装软件的包名为php,state=*:状态为安装
执行建立的php.yanl
[root@ansible ~]# ansible-playbook php.yaml
看到结果,ok=2 changed=1 说明客户机上的php安装成功了!
②、创建crontab计划
建立cron.yaml,让每月10号来运行/root/db.sql脚本
内容如下:
[root@ansible ~]# ansible-doc cron //模块帮助命令
[root@ansible ~]# vim /tmp/cron.yaml - hosts: hanodes remote_user: root tasks: - name: cron cron: name='test job' minute='*/5' hour='*' day='*' month='*' weekday='*' job="/usr/sbin/ntpdate 172.16.0.1"
查看各个节点上的crontab
[root@ansible ~]# ansible all -a "crontab -l"
③、handlers的用法
用于当关注的资源发生变化时采取一定的操作。
“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。
在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
案例:
- hosts: hanodes remote_user: root tasks: - name: ensure heartbeat latest version yum: name=heartbeat state=present //安装heartbeat - name: authkeys configure file copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys //copy模块,src为源文件地址,dest为节点目录 - name: authkeys mode 600 file: path=/etc/ha.d/authkeys mode=600 //修改文件权限为600 notify: //调用handlers列表中的重启操作 - restart heartbeat - name: ha.cf configure file copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf notify: //调用handlers列表中的重启操作 - restart heartbeat handlers: //定义handlers列表 - name: restart heartbeat service: name=heartbeat state=restarted //重启heartbeat服务
以上就是ansible的简单应用