ansible初步了解

久闻ansible大名,今天终于有机会来试用一番…

ansible简介

ansible是一款基于python开发的开源软件,它实现了软件依赖,配置管理和程序部署的自动化.ansible的最大特点是无客户端,它通过SSH,远程PowerShell或其他远程API与其他节点交互

ansible安装

ansible是工具类应用程序,不需要添加一个数据库,也没有一个守护进程

节点要求

控制节点要求:Python2.6+ or 3.5+,类UNIX系统(不支持Windows)

被管理节点要求:ssh(默认使用sftp,如果不可用可切换至scp),同样需要Python

安装方式

ansible可以使用包管理器安装,pip安装,以及源码安装

ansible已被主流Linux发行版收录,因此基本上可以使用各自的包管理器安装

Centos:

]# yum install -y ansible

ansible组件

ansible包含有多个组件.如inventory,ad-hoc command,playbook等等

inventory(仓库)

inventory存放了ansible管理主机的清单.更准确的说,inventory定义了所有被管理节点的连接方式.如连接ip,连接端口,主机名,ssh用户名和密码,python解释器路径等等都可以在这里定义

inventory默认存放在/etc/ansible/hosts文件中.也可以通过在命令中添加-i <path>参数选择不同的inventory文件

hosts文件示例:

1
2
3
4
5
6
7
8
9
10
mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

hosts文件除了默认的ini格式外,也可以使用yaml,json格式

hosts中有一个默认的主机组all,用于匹配所有主机

Ad-Hoc Commands(临时命令)

ad-hoc命令指那些一次性执行的命令.如果需要执行速度快的,单行的指令的话,那么就应该使用ad-hoc命令了

ad-hoc命令示例

ping命令:

1
2
3
4
5
6
7
8
9
[root@host1 ~]# ansible all -m ping
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host3 | SUCCESS => {
"changed": false,
"ping": "pong"
}

这是ad-hoc最常用的ping命令,其中:

  • 使用的主机组为all,即默认的所有主机
  • 使用了ping模块

发送shell命令:

1
2
3
4
5
6
[root@host1 ansible]# ansible hosts -a 'echo  hello' -f 2
host3 | SUCCESS | rc=0 >>
hello

host2 | SUCCESS | rc=0 >>
hello
  • 在hosts主机组运行echo hello命令
  • 使用两个并行fork

除这些以外,通过ansible的各种模块,ad-hoc命令可以实现文件传输,包管理,用户名用户组管理,源代码部署,服务管理等丰富的操作

playbook(剧本)

playbook是ansible的配置,部署和服务编排语言.它定义了ansible连接至被管理节点后需要做的任务

与ad-hoc命令相对,playbook是一组预定义的操作

the true power of Ansible lies in playbooks,playbook是ansible的核心组件

基础层面上,playbook可以用于管理远程机器的配置与部署.在更高的层面,它可以序列化滚动更新的多重部署

playbook示例

playbook使用YAML格式表达.下面是有两个剧本的playbook:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
---
- hosts: webservers
remote_user: root

tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: /srv/httpd.j2
dest: /etc/httpd.conf

- hosts: databases
remote_user: root

tasks:
- name: ensure postgresql is at the latest version
yum:
name: postgresql
state: latest
- name: ensure that postgresql is started
service:
name: postgresql
state: started
基础
任务列表

每个剧本都包含一个任务列表.任务同一时间按顺序执行,如果有节点执行失败,那么它将从整个playbook中移除

每个任务的目标都是使用指定的参数,变量去执行一个模块.模块应具备幂等性,如果一个playbook中所有的模块都具备幂等性,那么这个playbook就可以说是幂等的

name: DESCRIBE:用于描述此任务
module: options:选择使用的模块,以及参数.其中module可以是service,command,shell,copy,template等等
ignore_errors: True|False:是否忽略错误
notify:列表形式,包含一组命令,当做任务完成后的触发器

执行playbook

可以使用简单的指令去执行playbook:

]# ansible-playbook playbook.yml -f 10

小结

不得不说ansible是一个很强大的工具…以往复杂繁琐的运维流程基本上都可以通过ansible来简化

这篇是我对ansible的粗浅了解,以后如果有需要ansible工作的话,我会进一步的深入它

参考文档

金色之谜:运维自动化-Ansible ( 一 )

ansible官方文档

0%