ansible是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
:ansible中文权威指南
无客户端:不使用时系统开销为0
无服务器:直接运行命令
基于模块工作:可以使用任何语言开放自定义模块
yaml:使用yaml语言定制playbook-
默认基于ssh工作
幂等性:多次运行,结果不变
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、connection plugins:连接插件,负责和被监控端实现通信;
(2)、host inventory:主机库,是一个配置文件里面定义监控的主机;
(3)、modules:ansible自身核心模块、command模块、自定义模块;
(4)、Plugins:借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
在这里先解释一下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的脚本。后面再细讲。
ansible在epel源,使用yum可以直接安装
由于ansible是基于Python开发的,安装时还需要诸多Python包。
除此之外,还要用到PyYAML这个将yaml解析成python的工具。
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
[webservers]
www[1:50].example.com <==简写数字范围
db-[a:f].example.com <==简写字母范围
[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文件
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 <host-pattern> [-f forks] [-m module_name] [-a args]
<host-pattern> 指定被管控的主机,需要事先定义在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-doc -l
常用模块:
在远程主机运行命令
如:ansible webservers -m command -a "/sbin/reboot -t now"
在远程主机在shell进程下运行命令,支持shell特性,如管道等 。command的不支持重定向、管道。
从本地主机拷贝文件到远程、主机
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‘
管理crontab
ansible all -m cron -a ‘name=‘Time‘ state=present minute=‘*/5‘ job=‘/usr/sbin/ntpdate 172.168.0.1 &> /dev/null‘‘
从远程主机上取文件
设置文件属性
ansible all -m file -a ‘path=/tmp/testdir state=directory‘
你懂的
管理服务
ansible all -m script -a ‘/tmp/a.sh‘
获取远程主机的facts
ansible all -m setup
playbooks直接翻译过来就是剧本的意思。这个剧本内,定义个一个或者多个任务,比如创建角色、安装程序、启动服务等等。当运行这个脚本时,就可以一次性执行多个任务。
更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。
我们使用 ad-hoc 时,主要是使用 /usr/bin/ansible 程序执行任务。而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范。
playbooks用的是YAML格式,参见YAML语法
核心元素:
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
每一个 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
执行顺序
tasks从上到下执行
需要注意的是,在这play中的所有主机,全部主机执行完一个task,才会继续执行下一个task。
比如webservers 有两台主机web1和web2。当web1执行任务2失败,那么web1就会从整个playbook的rotation(轮转)中移除。
幂等性
重复多次执行 playbook 的结果是一样的
(1)变量命名:字母、数字和下划线组成,只能以字母开头;
(2)变量类型:
playbook定义变量格式:
- hosts: webservers
vars:
http_port: 80
变量引用:{{ variable }}
原文:https://www.cnblogs.com/LIAOBO/p/13596072.html