如何在智能告警平台CA触发测试告警
1017
2022-10-04
Ansible-企业最常选择的自动化运维工具
Ansible 概述
Ansible是一款为类Unix系统开发的自由开源的配置和自动化管理工具,可以管理远程主机,远程主机可以是远程虚拟机或者物理机,也可以使本地主机或者云主机。基于Python开发写成,类似于saltstack、puppet,实现了批量系统配置、批量程序部署、批量运行命令等功能。,Ansible基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,
Ansible只是提供一种框架,分布式、无客户端、轻量级架构,不需要在远程主机上安装client/agents,因为它们是基于ssh协议来和远程主机通讯的,只要能够SSH手动登录管理的工作,都可以通过Ansible管理。
Ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师进阶必须掌握的技能之一。
ansible 特点
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;默认使用SSH协议对设备进行管理;主从集中化管理;有大量常规运维操作模块,可实现日常绝大部分操作;配置简单、功能强大、扩展性强;支持API及自定义模块,可通过Python轻松扩展;通过Playbooks来定制强大的配置、状态管理;轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台;对云计算平台、大数据都有很好的支持
ansible 架构图
Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。
Ansible:Ansible核心程序。HostInventory:记录由Ansible管理的主机清单,包括端口、密码、ip等。Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。ConnectionPlugins:连接插件,Ansible和Host通信使用。
ansible 任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
ad-hoc模式(点对点模式)使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。playbook模式(剧本模式)是Ansible最主要的管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的文件。
ansible 执行流程
ansible 命令执行过程
加载配置文件,默认/etc/ansible/ansible.cfg;查找对应的主机配置文件,找到要执行的主机或者组;加载自己对应的模块文件,如 command;通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;给文件 +x 执行权限;执行并返回结果;删除临时py文件,sleep 0退出;
ansible命令参数
anisble命令语法:ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a模块参数]
ansible详细参数:
-v,–verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
inventory [ˈɪnvəntri] 库存
-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
-m NAME,-module-name=NAME # 指定使用的 module 名称,默认使用 command模块
-a,MODULE_ARGS #指定 module 模块的参数
-k,-ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证
-sudo # 指定使用 sudo 获得 root 权限
-K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用
-u USERNAME,-user=USERNAME # 指定移动端的执行用户
-C,–check #测试此命令执行会改变什么内容,不会真正的去执行
ansible-doc详细参数:
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s, --snippet # [ˈsnɪpɪt] 片断
ansible配置文件使用顺序
1.首先找执行ansible命令的当前目录中,是否有 ansible.cfg文件
./ansible.cfg
2.如果找不到,再 找当前用户的Home目录下是否有 .ansible.cfg
~/.ansible.cfg
3.如果还找不到,就找 /etc/ansible/ansible.cfg
/etc/ansible/ansible.cfg
要检查当前使用的是哪个配置文件。
ansible --version 命令中,会显示
Ansible 使用实战1-安装配置管理两个服务器节点
实验环境
ansible 服务端 TEST63 10.67.12.63
ansible节点1:TEST63 10.67.12.63
ansible节点2:TEST62 10.67.12.64
在TEST63上安装ansible
1、设置EPEL仓库
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。
[root@TEST63 ~]# yuminstall epel-release -y
2、 使用yum安装Ansible
[root@TEST63 ~]#yum installansible -y
安装完成后,检查ansible版本:
[root@TEST63 ~]#ansible --version
例:[root@TEST63 ~]#ansible-doc -s service
定义主机清单
1、基于端口,用户,密码定义主机清单
ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。
格式:ansible_ssh_port:指定ssh端口 ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全) ansible_sudo_pass:指明 sudo 时候的密码
例:[root@TEST63 ~]#vim /etc/ansible/hosts #文件 /etc/ansible/hosts 维护着Ansible中服务器的清单。在文件最后追加以下内容
[web-servers] #主机组名
10.67.12.64 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
简单测试下主机的连通性
[root@TEST63 ~]# ansible -i etc/ansible/hosts web-servers -mping
-i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
-m # 指定使用的ping模块
报错:
10.67.12.63 | FAILED!=> {
"msg": "Using a SSH passwordinstead of a key is not possible because Host Key checking is enabled andsshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
解决:[root@TEST63 ~]# sshroot@10.67.12.63 #手动连接一下/etc/ansible/hosts主机清单中的主机,这样就可以在ansible服务器上保存目标主机的fingerprint指纹。后期可以正常连接了
[root@TEST63 ~]#ansible -i hosts web-servers -m ping
10.67.12.64 | SUCCESS => { #表示成测试。通信成功。
"changed": false, #因为ping命令不会改变被管理的服务器的状态。所以是false正常
"ping": "pong"
}
2、基于ssh密钥来访问定义主机清单
一般来说,使用明文密码不安全,所以增加主机无密码访问。
在Ansible服务端生成密钥,并且复制公钥到节点中。
root@TEST63 ~]#ssh-keygen #一路回车
使用ssh-copy-id命令来复制Ansible公钥到节点:TEST63和TEST63
[root@TEST63 ~]#ssh-copy-id root@10.67.12.63
[root@TEST63 ~]#ssh-copy-id root@10.67.12.64
[root@TEST63 ~]# ssh 10.67.12.64
[root@TEST63 ~]# vim etc/ansible/hosts #在文件的最后添加以下内容
删除之前在最后添加的两行主机清单:
[web-servers]
10.67.12.64 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
增加:
[web-servers]
10.67.12.63
10.67.12.64
在Ansible服务端运行命令
ping模块检查网络连通性
command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令
例1:使用ping检查‘web-servers’或者ansible节点的连通性。
[root@TEST63 ~]#ansible -i etc/ansible/hosts 'web-servers' -m ping
或:
[root@TEST63 ~]#ansible 'web-servers' -m ping #不指定,默认使用/etc/ansible/hosts文件
10.67.12.63 | SUCCESS=> {
"changed": false,
"ping": "pong"
}
10.67.12.64 | SUCCESS=> {
"changed": false,
"ping": "pong"
}
例2:检查Ansible节点的运行时间(uptime)
[root@TEST63 ~]#ansible -m command -a "uptime" 'web-servers' #也可以把主机清单组名写到最后,这样方便阅读命令
10.67.12.63 | SUCCESS| rc=0 >>
12:45:23 up 32min, 5 users, load average: 0.17, 0.11, 0.27
10.67.12.64 | SUCCESS| rc=0 >>
12:45:23 up 26 min, 2 users, load average: 0.03, 0.03, 0.10
例3:检查节点的内核版本
[root@TEST63 ~]#ansible -m command -a "uname -r" 'web-servers'
例4:给节点增加用户
[root@TEST63 ~]#ansible -m command -a "useradd mk123" 'web-servers'
10.67.12.64 | SUCCESS| rc=0 >>
10.67.12.63 | SUCCESS| rc=0 >>
[root@TEST63 ~]#ansible -m command -a "grep mk123 etc/passwd" 'web-servers'
例5:将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中
[root@TEST63 ~]#ansible -m command -a "df -Th" 'web-servers' >/tmp/command-output.txt
[root@TEST63 ~]# cat/tmp/command-output.txt
ansible常见模块高级使用方法
1、3个远程命令模块的区别
(1)、command模块为ansible默认模块,不指定-m参数时,使用的就是command模块;comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and"&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;
(2)、shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。
例1:运行free -m 命令
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m shell -a "free -m"
注:但是我们自己定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
对shell模块的使用可以分成两块: 1) 如果待执行的语句少,可以直接写在一句话中:
[root@TEST63 ~]# ansible -i /etc/ansible/hosts web-servers -m shell -a "source ~/.bash_profile && df -h | grep sda3"
2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;
(3)、scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
[root@TEST63 ~]# vim /etc/ansible/net.sh
#!/bin/bash
date
hostname
[root@TEST63~]# ansible -i /etc/ansible/hosts web-servers -m script -a "/etc/ansible/net.sh"
2、copy模块:实现主控端向目标主机拷贝文件,类似scp功能
例1:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/etc/hostsdest=/tmp/ owner=root group=root mode=0755"
在TEST64上查看
[root@TEST64 ~]# ll/tmp/hosts
-rwxr-xr-x 1 rootroot 240 8月 24 16:09 /tmp/hosts
3、file模块设置文件属性。
例如:
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m file -a "path=/tmp/hostsmode=0777"
验证:
[root@TEST63 ~]# ll/tmp/hosts
-rwxrwxrwx 1 rootroot 112 Aug 31 04:38 /tmp/hosts
4、stat模块获取远程文件信息
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m stat -a"path=/tmp/hosts"
5、get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验。
例如:下载epel-release-latest-7.noarch.rpm到主机清单中的/tmp/目录下
[root@TEST63 ~]# ansible -i /etc/ansible/hosts web-servers-m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
注:url=https://xxx 的等号=前后不能有空格
扩展:查看force=yes的作用
[root@TEST63 ~]#ansible-doc -s get_url #在弹出的信息中找到force
如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。
如果为“否”,则仅在目标不存在时才下载文件。一般来说,只有小型本地文件才应该为“是”。在0.6之前,该模块表现为默认为“是”。
查看下载的文件:
[root@TEST63 ~]# ll/tmp/epel-release-latest-7.noarch.rpm
-r--r----- 1 rootroot 15080 8月 24 16:20/tmp/epel-release-latest-7.noarch.rpm
测试:下载文件时,当文件不一样时,会替换原来的文件
[root@TEST64 ~]# cp/etc/passwd /tmp/epel-release-latest-7.noarch.rpm
[root@TEST63 ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a"url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
10.67.12.63 | SUCCESS=> {
"changed":false, #TEST63上原来的文件和当前的文件一样,就没有改变。执行成功,但没有发生改变,那么显示绿色
。。。
}
10.67.12.64 | SUCCESS=> {
"changed": true, #TEST64上的文件名字一样,但是内容变,就会重新下载。执行成功,且发生改变,那么显示黄色
6、yum模块linux平台软件包管理。
yum模块可以提供的status状态:latest ,present,installed #这3个代表安装;removed, absent #后面2个是卸载
例子:安装php软件
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd state=latest"
7、cron模块远程主机crontab配置。
例如:增加每30分钟执行ls /tmp
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir'minute='*/30' job='ls /tmp'"
在TEST63上查看
[root@TEST63 ~]#crontab -l
#Ansible: list dir
*/30 * * * * ls /tmp
8、service模块远程主机系统服务管理。
service模块常用参数:
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
例如:远程启动apache服务
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpdstate=restarted"
9、sysctl模块远程主机sysctl配置。
例:开启路由转发功能
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m sysctl -a"name=net.ipv4.ip_forward value=1 reload=yes"
验证:
[root@TEST63 ~]# cat/proc/sys/net/ipv4/ip_forward
1
10、user模块远程主机用户管理
例如:
[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m user -a "name=TEST6 state=present"
# present [ˈpreznt] 目前
验证:
[root@TEST63 ~]# idTEST6
uid=1001(TEST6)gid=1001(TEST6) 组=1001(TEST6)
发表评论
暂时没有评论,来抢沙发吧~