文章目录
Ansible 自动化运维简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
注: ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架
Ansible 特点
- 部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作
- 默认使用 SSH(Secure Shell)协议对设备进行管理
- 主从集中化管理
- 配置简单、功能强大、扩展性强
- 支持 API 及自定义模块,可通过 Python 轻松扩展
- 通过 Playbooks 来定制强大的配置、状态管理
- 对云计算平台、大数据都有很好的支持
- 提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 ---- AWX 平台
Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt。这是一款很简单也很容易入门的部署工具,它使用SSH连接到服务器并运行配置好的任务,服务器上不用安装任何多余的软件,只需要开启ssh,所有工作都交给ansible端去负责,减少了大量的时间
ansible 工作模块介绍
- 连接插件connection plugins:负责和被监控端实现通信
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机
- 各种模块核心模块、command模块、自定义模块
- 借助于插件完成记录日志邮件等功能
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务
Ansible的架构
核心组件构成:
-
ansible(主体):ansible的核心程序,提供一个命令行接口给用户对ansible进行管理操作;
-
Host Inventory(主机清单):为Ansible定义了管理主机的策略。一般小型环境下我们只需要在host文件中写入主机的IP地址即可,但是到了中大型环境我们有可能需要使用静态inventory或者动态主机清单来生成我们所需要执行的目标主机
-
Core Modules(核心模块):Ansible执行命令的功能模块,多数为内置的核心模块。
-
Custom Modules(拓展模块):如何ansible自带的模块无法满足我么你的需求,用户可自定义相应的模块来满足自己的需求
-
Connection Plugins(连接插件):模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
扫描二维码关注公众号,回复: 12886297 查看本文章 -
Playbook(任务剧本):编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的* YML文件
-
API:供第三方程序调用的应用程序编程接口
ansible工作原理
-
管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块
-
可以按应用类型等方式进行HostInventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc
-
管理节点可以通过playbooks
实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件
ansible案例
环境:
master:20.0.0.3
node1:20.0.0.4
node2:20.0.0.5
注:这里用主从好区分,严格来说,ansible不区分master节点和slave节点,它只有deploy(管理员)节点
ansible 程序结构
安装目录如下:
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
安装ansible
注:我们需要先安装一个epel-release包,然后再安装我们的 ansible 即可。
yum -y install epel-release
yum –y install ansible
节点配置公私钥
'分类名字 IP'
[root@master ~]# vi /etc/ansible/hosts
[master]
20.0.0.3
[node]
20.0.0.4
20.0.0.5
免密认证
[root@master ~]# ssh-keygen -t rsa '一直空格没有设置密码'
ssh-copy-id root@20.0.0.4
ssh-copy-id root@20.0.0.5
'免交互代理'
ssh-agent bash
ssh-add //生成密钥时设置的密码 我没有设置
测试连接
[root@master ~]# ansible node -m ping
20.0.0.5 | SUCCESS => {
....
20.0.0.4 | SUCCESS => {
....
//尝试用ansible命令 获取节点的时间
[root@master ~]# ansible node -m command -a 'date'
20.0.0.4 | CHANGED | rc=0 >>
2021年 01月 13日 星期三 11:09:50 CST
20.0.0.5 | CHANGED | rc=0 >>
2021年 01月 13日 星期三 11:09:50 CST
ansible命令行模块
ping模块
[root@master ~]# ansible node -m ping
command模块
注:命令模块 适合使用简单的命令 无法支持"<",">","|",";","&"等符号
命令格式:ansible [主机] -m 模块 -a ‘date’
'指定IP执行date'
ansible 20.0.0.5 -m command -a 'date'
'指定分类执行date 这里设置的分类有master与node上面'
ansible node -m command -a 'date'
'所有hosts主机执行 all'
ansible all -m command -a 'date'
'不加-m模块 则默认运行command模块'
ansible all -a 'date'
cron(计划任务)模块
- job:要执行的任务
- name:该任务的描述(必须项)
- 支持时间:minute,hour,day,month,weekday
- 两种状态(state):present表示添加(可以省略),absent表示移除
- backup:对远程主机上的原任务计划内容修改之前做备份
每分钟添加字段到/opt/aaa.txt里
[root@master ~]# ansible node -m cron -a 'minute="*/1" job="/usr/bin/echo hello >> /opt/aaa.txt" name="test cron aaa"'
'查看node任务'
[root@master ~]# ansible node -a 'crontab -l'
#Ansible: test cron aaa
*/1 * * * * /usr/bin/echo hello >> /opt/aaa.txt
'取消node任务'
ansible node -m cron -a 'name="test cron aaa" state=absent'
copy文件模块
- src:指定将本地管理主机的什么数据信息进行远程复制
- dest:将数据复制到远程节点的路径信息
- content:在文件中添加信息
- group:文件数据复制到远程主机,设置文件属组用户信息
- mode:文件数据复制到远程主机,设置数据的权限 0755
- owner:文件数据复制到远程主机,设置文件属主用户信息
注:copy模块在复制数据时,如果数据为软链接文件,会将链接指定源文件进行复制
[root@master ~]# ansible node -m copy -a "src=/etc/fstab dest=/root"
[root@node1 ~]# cat fstab
....
'content在文件中添加信息'
[root@master ~]# ansible node copy -a "content={
{ansible_all_ipv4_addresses}} dest=/opt/a.txt"
[root@node1 opt]# cat a.txt
["192.168.122.1", "20.0.0.4"][root@node1 opt]# cd
shell模块
注:可以使用"<",">","|",";","&"等符号特殊符号
- chdir:在执行命令前,进入到指定目录中
- creates:判断指定文件是否存在,如果存在,不执行后面的操作
- removes:判断指定文件是否存在,如果存在,执行后面的操作
在node2下面安装httpd服务,给apache配置一个页面
[root@master ~]# ansible 20.0.0.5 -m shell -a 'chdir=/var/www/html echo this is node2 > index.html'
20.0.0.5 | CHANGED | rc=0 >>
[root@master ~]# ansible node -m shell -a 'chdir=/var/www/html ls'
20.0.0.5 | CHANGED | rc=0 >>
index.html
'就指定了node2所以node1报错'
20.0.0.4 | FAILED | rc=-1 >>
Unable to change directory before execution: [Errno 2] 没有那个文件或目录: '/var/www/html'
user模块
user模块请求的是useradd,userdel,usermod三个指令
'节点创建用户wxy'
ansible node -m user -a 'name=wxy'
'查看wxy用户生成密钥'
ansible node -m command -a 'tail /etc/passwd'
20.0.0.5 | CHANGED | rc=0 >>
....
20.0.0.5 | CHANGED | rc=0 >>
....
wxy:x:1001:1001::/home/wxy:/bin/bash
'删除用户 name=" " '
[root@master ~]# ansible node -m user -a 'name="wxy" state=absent'
group模块
注:可以远程批量创建用户组信息
- gid:设置组的GID号
- name:指定组的名称
- state:指定组的状态,默认为创建,设置值为absent为删除
- system:设置值为yes,表示创建为系统组
'创建一个指定的用户组'
ansible 20.0.0.4 -m group -a 'name=pig gid=1024 system=yes'
20.0.0.4 | CHANGED => {
'删除一个指定的用户组'
[root@master ~]# ansible 20.0.0.4 -m group -a "name=pig gid=1024 state=absent"
'把用户lisi添加到ping组'
ansible node -m user -a 'name=lisi uid=1050 system=yes group=ping'
'查看node1的id lisi'
[root@master ~]# ansible 20.0.0.4 -a 'id lisi'
20.0.0.4 | CHANGED | rc=0 >>
uid=1050(lisi) gid=1020(ping) 组=1020(ping)
file模块
主要实现创建/删除文件信息 对数据权限进行修改
- dest/path/name:将数据复制到远程节点的路径信息
- state=directory:创建一个空目录信息
- =file:查看指定目录信息是否存在
- =touch:创建一个空文件信息
- =hard/link:创建链接文件
注:node的aaa.txt是创建的文件
修改文件的属主属组权限
ansible 20.0.0.4 -m file -a 'owner=lisi group=mysql mode=600 path=/opt/aaa.txt'
[root@node1 opt]# ll
总用量 16
-rw-------. 1 lisi mysql 2394 1月 13 18:49 aaa.txt
添加软连接
ansible 20.0.0.4 -m file -a 'src=/opt/aaa.txt path=aa.txt state=link'
'path=aa.txt 默认在root目录'
[root@node1 ~]# ll
lrwxrwxrwx. 1 root root 12 1月 13 18:49 aa.txt -> /opt/aaa.txt
删除文件
[root@master ~]# ansible 20.0.0.4 -m file -a ' path=aa.txt state=absent'
创建文件
[root@master ~]# ansible 20.0.0.4 -m file -a "path=test state=touch"
[root@node1 ~]# ll
总用量 16
w-r--r--. 1 root root 0 1月 13 18:56 test
yum模块
使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
- name:指定软件名称信息
- state(absent/removed):将软件进行卸载(慎用)
- =(present/installed): 将软件进行安装
- latest:安装最新的软件 yum update
'安装httpd服务'
root@master ~]# ansible node -m yum -a 'name=httpd'
'卸载httpd服务'
[root@master ~]# ansible node -m yum -a 'name=httpd state=absent'
service服务模块
注:用于管理服务运行状态
- enabled:设置服务是否开机自启动 如果参数不指定,原有服务开机自启动状态进行保留
- name :设置要启动/停止服务名称
- state=(started):启动 =(stopped):停止 =(restarted):重启
'启动http'
[root@master ~]# ansible node -m service -a 'enabled=true name=httpd state=started'
'关闭http'
[root@master ~]# ansible node -m service -a 'name=firewalld state=stopped'
script模块
注:在指定的被控制节点上执行控制节点上的脚本
[root@master ~]# cat test.sh '管理端创建脚本'
.....
[root@master ~]# ansible node -m script -a 'test.sh'
setup模块
获取node组主机的facts的信息
[root@master ~]# ansible node -m setup
....
fetch模块
注:抓取文件到管理机上
- src:要获取的远程系统上的文件,必须是文件,而不是目录
- dest:用于保存文件的目录
a.txt是node2里面直接创建的,方便实现抓取
[root@master ~]# ansible 20.0.0.5 -m fetch -a 'src=/root/a.txt dest=/root'
20.0.0.5 | CHANGED => {
[root@master 20.0.0.5]# cd root/
[root@master root]# ll
总用量 0
-rw-r--r--. 1 root root 0 1月 13 16:19 a.txt