Ansible 自动化运维原理介绍+命令模块详细操作过程

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(连接插件):模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用

  • 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 >>
20210113日 星期三 11:09:50 CST
20.0.0.5 | CHANGED | rc=0 >>
20210113日 星期三 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 113 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 113 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 113 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 113 16:19 a.txt

猜你喜欢

转载自blog.csdn.net/weixin_50344807/article/details/112545704