一、ansible基础
1、介绍
ansible是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
:ansible中文权威指南
2、特性:
无客户端:不使用时系统开销为0
无服务器:直接运行命令
基于模块工作:可以使用任何语言开放自定义模块
yaml:使用yaml语言定制playbook-
默认基于ssh工作
幂等性:多次运行,结果不变
3、架构
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、connection plugins:连接插件,负责和被监控端实现通信;
(2)、host inventory:主机库,是一个配置文件里面定义监控的主机;
(3)、modules:ansible自身核心模块、command模块、自定义模块;
(4)、Plugins:借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
4、用法
在这里先解释一下ansible的用法,看不懂可以先跳过。
其基本上可以分为ad-hoc和playbooks两种方式。
ad-hoc模式、
ad-hoc(点对点)是相对 playbook 来说的。类似于在命令行敲入shell命令和 写shell scripts两者之间的关系。
如当本地管理主机(IP:172.16.80.101)执行ansible 172.16.80.101 -a "/sbin/reboot"
,就可以通过ssh传输命令,把172.16.80.101这台主机重启了。playbooks模式
在playbooks中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。有点像shell的脚本。后面再细讲。
5、安装
ansible在epel源,使用yum可以直接安装
由于ansible是基于Python开发的,安装时还需要诸多Python包。
除此之外,还要用到PyYAML这个将yaml解析成python的工具。
- 配置文件
(1)ansible应用程序的主配置文件:/etc/ansible/ansible.cfg
(2) Host Inventory定义管控主机:/etc/ansible/hosts
二、host Inventory文件
Ansible 可以同时操作一个组的多台主机。组和主机之间的关系通过inventory文件 配置。默认路径为/etc/ansible/hosts。
/etc/ansible/hosts 文件的格式与windows的ini配置文件类似
- 基本定义
mail.example.com <==直接指定某个主机
[webservers] <==组名
foo.example.com <==组成员
bar.example.com <==组成员
[dbservers] <==组名
one.example.com:9527 <==指定非标准ssh端口
foo.example.com <==同一台主机,可以属于多个组
172.16.80.100 <==直接用主机IP
- 批量host简写
[webservers]
www[1:50].example.com <==简写数字范围
db-[a:f].example.com <==简写字母范围
- 主机和变量
在定义主机时,还可以把变量传递给主机,这些变量可以用在 playbooks中
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
- 组和变量
注意,要先定义组
[websuvs]
web1
web2
[websuvs:vars]
http_port=8080
https_port=443
更多定义参考:Inventory文件
三、ansible常用命令
1、ansible-doc命令
Usage: ansible-doc [options] [module...]
Options:
-a, --all 查看所有模块的文档
-h, --help 查看帮助
-l, --list 列出所有可用模块
-M MODULE_PATH, --module-path=MODULE_PATH
列出模块路径
-s, --snippet 获取指定模块的使用信息
-v, --verbose 详细信息
--version 查看程序版本
2、ansible命令
Usage: ansible [-f forks] [-m module_name] [-a args]
指定被管控的主机,需要事先定义在inventory文件中,可以是IP、组,支持模式匹配;all表示所有inventory定义的主机。
[-f forks] 指定线程数,即同时处理的主机数,默认是5
[-m module_name] 指定使用的模块
[-a args] 指明模块的参数
例子:
ansible webservers -m service -a "name=httpd state=started"
#使用service模块,启动webservers组的httpd服务
ansible webservers -m ping
#使用ping模块检查webservers组
ansible webservers -m command -a "/sbin/reboot -t now"
#使用command模块,在webservers组执行命令“/sbin/reboot -t now”
3、ansible-playbook
Usage: ansible-playbook playbook.yml
Options:
-C, --check 干跑playbook.yml,不真正执行
四、ansible常用模块
获取模块列表:ansible-doc -l
常用模块:
1、 command模块
在远程主机运行命令
如:ansible webservers -m command -a "/sbin/reboot -t now"
2、shell模块
在远程主机在shell进程下运行命令,支持shell特性,如管道等 。command的不支持重定向、管道。
3、copy模块
从本地主机拷贝文件到远程、主机
- 参数
dest=(远程主机上路径)
src=(本地主机路径)
content=(直接指明内容)
owner=
group=
mode= - 用法:
- 指明源文件路基、目标文件路径
ansible 172.16.80.101 -m copy -a 'src=/etc/hosts dest=/app/hosts'
- 指明文件内容、目标文件路径
ansible 172.16.80.101 -m copy -a 'content=hello dest=/app/helloword'
- 指明源文件路基、目标文件路径
4、cron模块
管理crontab
- 参数
minute=
day=
month=
weekday=
hour=
job=
*name=
state= present(创建)或者absent(删除) - 用法
ansible all -m cron -a 'name='Time' state=present minute='*/5' job='/usr/sbin/ntpdate 172.168.0.1 &> /dev/null''
5、fetch模块
从远程主机上取文件
6、file模块
设置文件属性
- 用法
(1) 创建链接文件:*path= src= state=link
(2) 修改属性:path= owner= mode= group=
(3) 创建目录:path= state=directory
ansible all -m file -a 'path=/tmp/testdir state=directory'
7、yum模块
你懂的
- 参数
name=:程序包名称,可以带版本号;
state=present、latest、absent
8、service模块
管理服务
- 参数
*name=
state=started、stopped、restarted
enabled=
runlevel=
9、user模块
- 参数
*name=
system=
uid=
shell=
group=
groups=
comment=
home=
10、script模块
- 用法
ansible all -m script -a '/tmp/a.sh'
11、setup模块
获取远程主机的facts
- 用法
ansible all -m setup
五、playbooks
1、什么是playbooks?
playbooks直接翻译过来就是剧本的意思。这个剧本内,定义个一个或者多个任务,比如创建角色、安装程序、启动服务等等。当运行这个脚本时,就可以一次性执行多个任务。
更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。
我们使用 ad-hoc 时,主要是使用 /usr/bin/ansible 程序执行任务。而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范。
playbooks用的是YAML格式,参见YAML语法
核心元素:
- Hosts:主机
- Tasks:任务列表
- Variables:变量
- Templates:包含了模板语法的文本文件;
- Handlers:由特定条件触发的任务;
- Roles:角色
Play
如果说playbooks是剧本,那么剧本就是由一幕幕戏组成的。play就是剧本上的某一幕。一个或者多个plays组成一个完整的剧本。
play例子(下面的内容会以这个play讲解):
--- <==YAML格式,表示一个文件的开始
- hosts: webservers <==运行指定任务的目标主机
vars: <==定义参数
http_port: 80
max_clients: 200
remote_user: root <==在远程主机上执行任务的用户
tasks: <==任务列表
- name: ensure apache is at the latest version <==任务1的名字
yum: pkg=httpd state=latest <==任务1具体执行的内容
- name: write the apache config file <==任务2的名字
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running <==任务3的名字
service: name=httpd state=started
handlers:
- name: restart apache <==触发条件
service: name=httpd state=restarted
2、Tasks 列表
每一个 play 包含了一个 tasks 列表(任务列表),每个task拥有一个name和module。
如上面的play例子Tasks列表下有3个任务
tasks: <==任务列表
- name: ensure apache is at the latest version <==任务1的名字
yum: pkg=httpd state=latest <==任务1具体执行的内容
- name: write the apache config file <==任务2的名字
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running <==任务3的名字
service: name=httpd state=started
- name
由于注释这个task的功能,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的。如果没有定义 name,‘action’ 的值将会用作输出信息中标记特定的 task。 - modules
通过调用上述的command、shell、copy、cron、file、yum等模块执行的动作执行顺序
tasks从上到下执行
需要注意的是,在这play中的所有主机,全部主机执行完一个task,才会继续执行下一个task。
比如webservers 有两台主机web1和web2。当web1执行任务2失败,那么web1就会从整个playbook的rotation(轮转)中移除。幂等性
重复多次执行 playbook 的结果是一样的
3、Variables
(1)变量命名:字母、数字和下划线组成,只能以字母开头;
(2)变量类型:
- (a) facts:可直接调用,通过setup模块直接获取目标主机的facters
- (b)Inventory中定义变量,这些变量直接传递给单个主机。具体定义格式,请参考上面Inventory的内容。
- (c)playbook中定义变量
- (d) 在roles定义变量
playbook定义变量格式:
- hosts: webservers
vars:
http_port: 80
变量引用:{{ variable }}