一. 什么是ansible ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”――简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。 所有的这几个目标本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。就像我之前有介绍过的Fabric,以及我们基于Fabric开发的自动化应用部署的工具: Essay 。都是做了这么个事―― 批量的在远程服务器上执行命令 。 那么fabric和ansible有什么差别呢?简单来说fabric像是一个工具箱,提供了很多好用的工具,用来在Remote执行命令,而Ansible则是提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务。这就像是库和框架的关系一样。 当然,它们之间也是有共同点的――都是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。 相对来说,ansible有如下优点:
1、轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可
2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行
3、使用python编写的,维护更简单,ruby语法过于复杂
4、支持sudo 二、安装ansible 实验环境 : 服务器名 | 域名 | IP | 节点1 | node1.gulong.com | 172.16.8.5 | 节点2 | node2.gulong.com | 172.16.8.8 | Ansible服务器 | ansible.gulong.com | 172.16.8.9 |
在Ansible服务器上安装Ansible 先解决依赖关系: # yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto//注:python-jinja2在centos的第二张光盘上安装ansible-1.5.4-1.el6.noarch.rpm # rpm -ivh ansible-1.5.4-1.el6.noarch.rpm三、Ansible的配置 1、编辑/etc/ansible/hosts(节点配置文件): [iyunv@station142 ~]# vim /etc/ansible/hosts//添加如下内容:[hanodes]node1.gulong.comnode2.gulong.com//其他内容可以全部注释掉2、修改/etc/hosts文件,使之可以解析另外2个节点 [iyunv@station142 ~]# vim /etc/hosts//添加以下内容:172.16.8.8 node2.gulong.com172.16.8.5 node1.gulong.com3、配置ansible端能基于密钥认证的方式联系各被管理节点。 [root@station142 ~]# ssh-keygen -t rsa -P ''
4、把密钥发往各个节点服务器上: [iyunv@station142 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@node2.gulong.com[iyunv@station142 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@node1.gulong.com四、各个服务器节点的配置 1、节点1的配置,修改主机名 [root@node1 ~]# hostname node1.gulong.com //及时生效[root@node1 ~]# vim /etc/sysconfig/network //重启生效//添加如下内容:NETWORKING=yesHOSTNAME=node1.gulong.com2、节点2的配置,修改主机名: [root@node1 ~]# hostname node2.gulong.com //及时生效[root@node1 ~]# vim /etc/sysconfig/network //重启生效//添加如下内容:NETWORKING=yesHOSTNAME=node2.gulong.com五、Ansible简单测试 简单格式:ansible 节点名称 [ -m 模块] -a 命令参数 例子如下: 1、查看各个节点的时间 [iyunv@station142 ~]# ansible all -a date[iyunv@station142 ~]# ansible all -m command -a date//以上两条命令结果是一样的,因为默认调用 command 模块,所以可以省略, all 表示所有节点, -a 后面是参数
2、查看各个节点在线情况 [iyunv@station142 ~]# ansible all -m ping//内建的ping模块
3、在各个节点输出指定信息 [iyunv@station142 ~]# ansible all -a "/bin/echo hello, world"
六、Ansible-playbook 1、Playbook是通过yaml文件来配置实现的,先来介绍下yaml语法! YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例: name: John Smithage: 41gender: Malespouse: name: Jane Smith age: 37 gender: Femalechildren: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: FemaleYAML文件扩展名通常为.yaml,如example.yaml 2、Playbook可以用来管理复杂任务 对于需反复执行的、较为复杂的任务,我们可以通过定义 Playbook 来搞定。Playbook 是 Ansible 真正强大的地方,它允许使用变量、条件、循环、以及模板,也能通过角色 及包含指令来重用既有内容。下面我们来看看一些具体的实例。 1:安装php软件: 建立php.yaml文件 内容如下: - hosts: hanodes remote_user: root tasks: - name: php installing yum: name=php state=present选项解析: hosts:hanodes 指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组 remote_user:root 用于指定远程主机上的执行任务的用户 tasks: 任务 -name:php installing 给这个任务起的名字 yum:name=php 利用yum模块,安装软件的包名为php state=present 状态为安装 state=absent 状态为卸载 [iyunv@station142 ~]# ansible-playbook php.yaml
看到结果,ok=2 changed=1 说明客户机上的php安装成功了! 2、创建crontab计划 建立cron.yaml,让每月10号来运行/root/db.sql脚本 内容如下: - hosts: hanodes remote_user: root tasks: - name: cron cron: name='test job' day='10' job="/root/db.sql"[iyunv@station142 ~]# ansible-playbook cron.yaml
看到结果,ok=2 changed=1 说明客户机上的crontab计划创建成功了! 查看各个节点crontab:
注: 大家可以用 "ansible-doc -l" 命令来查看它内置的有哪些模块。 然后利用"ansible-doc 模块名" 命令来查看具体模块的详细用法。 3、 handlers的用法 用于当关注的资源发生变化时采取一定的操作。 “notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之, 仅在所有的变化发生完成后一次性地执行指定操作。 在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。 案例
- hosts: hbhosts 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的简单应用已经介绍完成,不足之处,请多加指点!
|