一、Ansible介绍
Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务器上!
1、Ansible能做什么
ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
- 比如:同时在100台服务器上安装nginx服务,并在安装后启动它们。
- 比如:将某个文件一次性拷贝到100台服务器上。
- 比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中我们都可以使用到ansible。
2、Ansible特性
- 模块化:调用特定的模块,完成特定任务
- 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
- 支持自定义模块
- 基于Python语言实现
- 部署简单,基于python和SSH(默认已安装),agentless
- 安全,基于OpenSSH
- 支持playbook编排任务
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
- 无需代理不依赖PKI(无需ssl)
- 可使用任何编程语言写模块
- YAML格式,编排任务,支持丰富的数据结构
- 较强大的多层解决方案
3、Ansible架构
- Ansible核心组件说明:
Ansible:Ansible的核心程序
Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Connection Plugins:连接插件,Ansible和Host通信使用
二、Ansible 的安装
安装方法有很多,这里仅仅以CentOS 7 yum安装为例,Ansible默认不在标准仓库中,需要用到EPEL源。
yum install ansible -y
[[email protected] ~]# ansible --version
ansible 2.6.2
config file = /etc/ansible/ansible.cfg
configured module search path = [u‘/root/.ansible/plugins/modules‘, u‘/usr/share/ansible/plugins/modules‘]
ansible python module location = /usr/lib/python2.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
三、Ansible 配置
1、实验环境
我这里主要是拿这几台设备进行测试,分组是随意的。
IP | 系统 | 功能 |
---|---|---|
10.0.0.14 | CentOS 6.7 | ansible主控服务器 |
10.0.0.4 | CentOS 7.3 | cluster1 |
10.0.0.9 | CentOS 6.6 | cluster1 |
10.0.0.19 | CentOS 6.9 | cluster2 |
10.0.0.20 | CentOS 6.5 | cluster2 |
10.0.0.21 | CentOS 6.5 | cluster2 |
2、Inventory 主机清单
在主控服务器上面配置清单。
# cat /etc/ansible/hosts
[cluster1]
10.0.0.4
10.0.0.9
[cluster2]
10.0.0.19
10.0.0.20
10.0.0.21
3、配置无密码通信
这里配置比较简单,自行操作一下。
4、测试 ping
[[email protected] ~]# ansible all -m ping
10.0.0.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.19 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.21 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.20 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.9 | SUCCESS => {
"changed": false,
"ping": "pong"
}
四、Ansible 模块
ansible 使用方法
ansible <host-pattern> [-m module_name] [options]
指令 匹配规则的主机清单 -m 模块名 选项
查看模块使用方法
ansible-doc -s MODULE_NAME
1、ping
功能:尝试连接到主机,验证并返回pong成功。
对于Windows目标,请改用win_ping模块
不使用icmp协议,使用ssh协议。
# ansible all -m ping
10.0.0.4 | SUCCESS => {
"changed": false,
"ping": "pong" # 返回pong表明成功通讯
}
2、command
功能:在远程节点上执行命令
变量和操作符号 "<", ">", "|", ";" and "&" 不能正常工作。如果需要使用,请使用 shell 模块
Ansible 默认不指定模块时,将使用此模块。
[[email protected] ~]# ansible cluster1 -a ‘date‘
10.0.0.4 | SUCCESS | rc=0 >>
Thu Sep 13 17:00:23 CST 2018
10.0.0.9 | SUCCESS | rc=0 >>
Thu Sep 13 17:00:33 CST 2018
3、shell
功能:在远程节点上执行命令。
与command模快使用一致,但是,变量 和操作符号 "<", ">", "|", ";" and "&" 能正常工作。
我这里使用通配符,使用command
模块是不行的。
# ansible cluster1 -m command -a ‘ls -d /usr/local/tomcat0[1-3]‘
10.0.0.4 | FAILED | rc=2 >>
ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code
10.0.0.9 | FAILED | rc=2 >>
ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code
改成shell
模块就可以。
# ansible cluster1 -m shell -a ‘ls -d /usr/local/tomcat0[1-3]‘
10.0.0.4 | SUCCESS | rc=0 >>
/usr/local/tomcat01
/usr/local/tomcat02
/usr/local/tomcat03
10.0.0.9 | SUCCESS | rc=0 >>
/usr/local/tomcat01
/usr/local/tomcat02
/usr/local/tomcat03
4、cron
功能:管理计划任务
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,,/2,……)
hour:小时(0-23,,/2,……)
minute:分钟(0-59,,/2,……)
month:月(1-12,,/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行
- 创建一个定时任务。
# ansible cluster1 -m cron -a ‘name="test cron job" minute=*/2 job="/usr/bin/wall hello world"‘ 10.0.0.4 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "test cron job" ] } 10.0.0.9 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "test cron job" ] }
- 查看创建的任务
# ansible cluster1 -a ‘crontab -l‘
10.0.0.4 | SUCCESS | rc=0 >>
42 5 * * * /usr/sbin/ntpdate time1.aliyun.com
#Ansible: test cron job
*/2 * * * * /usr/bin/wall hello world
10.0.0.9 | SUCCESS | rc=0 >>
23 15 * * * /usr/sbin/ntpdate time1.aliyun.com
#Ansible: test cron job
*/2 * * * * /usr/bin/wall hello world
- 删除定时任务
# ansible cluster1 -m cron -a ‘name="test cron job" minute=*/2 job="/usr/bin/wall hello world" state=absent‘
10.0.0.4 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": []
}
10.0.0.9 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": []
}
原文地址:http://blog.51cto.com/wzlinux/2174845