运维工作中总需要批量的对服务器进行管理,配置和一些命令的批量执行的操作。ansible恰恰是一款可以很好的帮助我们完成这些工作的软件,下面就来看看ansible是如果帮助我们很好的管理我们的服务器以及批量的在远程进行命令的吧。
安装:
环境:fedora,glibc版本>=2.15,所以centos不适合,glibc会影响到ansible-playbook的执行
安装源:epel
安装过程:yum install -y ansible
安装目录:配置文件所在目录:/etc/ansible:ansible.cfg,hosts
二进制文件所在目录:/usr/bin:ansible,ansible-playbook,ansible-doc...
配置:
ansible的主配置文件是/etc/ansible.cfg,里面的参数具体还没研究过,不过不太影响正常的使用。所以之后会做研究。
hosts文件是ansible的一个很重要的文件。可以看做ansible的资产管理和统计的一个文件。该文件里面的对所有的机器按照固定的格式进行了分类。例如:
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
当主机是以主机名的形式给出的时候server要能够正确的解释此主机名。分组的主机还支持匹配的形式:
[webservers]
[a-z].example.org
example.[org|com]
192.168.1.*
192.168.2.[22-55]
使用:
下面就来使用下,让ansible工作起来吧.
ansible主机:fedora
测试机:192.168.1.100
首先要让两台机器之间可以无密码登陆:在fedora上通过ssh-keygen生成密钥和公钥。将这个公钥拷贝到测试机上,然后cat id_rsa.pub >> /root/.ssh/authorized_keys,添加信任。
然后在fedora的/etc/hosts上添加一个分组,将测试机添加进去:
[TEST]
192.168.1.1001
在确保两台机器的ssh端口都打开防火墙和selinux都关闭的情况下,就可以测试啦。
测试命令:
ansible TEST -m command -a uptime
这就是一个简单的ansible的命令的使用。
模块:
ansible的工作很大程度上是依赖模块的工作。一个好的合适的模块可以帮我们省去很多的事情。在命令中用-m来指定模块名称,eg:
ansible TEST -m copy src=/home/1.sh dest=/home/ (-m指定copy模块,后面则是这个模块的用法:src指本地被拷贝的文件路径,dest指拷贝到远程机器上的路径)
每个模块的用法都有所不同,所带的参数也有所不同。后续我也会多了解一些常用模块的用法,以及根据实际需求来自己编写模块。
playbook:
ansible的playbook(剧本)应该算是ansible的精华了,它可以将多个任务放在一起,然后执行这个playbook之后会使得机器达到我们预期的状态。在这里,我们需要转变思维。不是我们通过运行playbook来批量执行命令;而是我们通过运行playbook使得服务器达到一种状态。playbook成功执行的标志是服务器达到了一种状态,例如我们执行如下的playbook:
---
# This playbook contains common plays that will be run on all nodes.
- name: Install ntp
yum: name=ntp state=present
tags: ntp
- name: Configure ntp file
template: src=ntp.conf.j2 dest=/etc/ntp.conf
tags: ntp
notify: restart ntp
- name: Start the ntp service
service: name=ntpd state=started enabled=true
tags: ntp
- name: test to see if selinux is running
command: getenforce
register: sestatus
changed_when: false
执行之后服务器的状态就是安装了ntp的时间同步服务而且完成了时间同步,关闭了selinux服务。这个playbook就是为了使服务器达到这样的状态,所以它重复多次执行也不会造成其他的影响。
playbook的格式是YAML的语法形式,它是一种.yml结尾的文件。关于YAML的语法还需要去进一步深入,ansible的官网上也给出了YAML的语法知识(http://docs.ansible.com/YAMLSyntax.html)。它对tab符号和空格特别敏感。要避免使用tab符,之前编写的时候习惯的用tab,结果运行就一直报语法错误。
一个项目的组成结构:
要完成对一个或者一批服务器的配置,仅仅的使用一堆的命令或者堆砌playbook显然不是一个好方法。这里就要引入角色的概念了。角色roles,它表示服务器在集群中会扮演某一个角色,一个服务器可能会扮演很多角色,比如它可以是web服务器,也可以是数据库服务器。通过playbook来帮助服务器完成某一个角色。
下面通过一个例子来介绍如何完成一个部署任务。有两台服务器,web1,web2,他们分别被部署成webserver和dbserver,当然,他们也有相同的软件需要部署和配置。先来看看如何用ansible来规划这个部署任务:
其中蓝色方框代表目录,实线箭头指向目录下一层。黄色的圆形代表文件;绿色的圆形代表和var,roles为同一级目录的文件。虚线表示文件或目录的名称在文件中的定义。
从这样一个组织结构可以看出site.yml是主要的playbook,里面指定了哪些服务器扮演哪些角色。hosts则是资产管理中心,它对服务器进行分组管理。roles目录下包含了三种角色的目录;每个角色的目录中都包含了成为这个角色需要完成的任务的playbook和模板配置文件(db,web和common的目录结构是一样的所以这里只给出common的)。vars目录下存放的是不同分组的变量文件,这里的变量是全局的。
这样,执行ansible-playbook -i hosts site.yml就可以开始部署了。
关于ansible也是初次接触,还有很多用法都不熟悉。还有以下目标需要完成:
1.利用ansible完成部署项目
2.ansible官网使用文档的阅读,了解ansible更高级的用法
3.ansible自带模块的熟悉以及学会根据需求编写模块