一、ansible概述
不是 C/S 架构,就是一种工具
1 : linux 自动化运维
编写程序实现运维自动化:shell python
工具模式自动化:
①OS Provisioning: RedHat satellite;PXE(可实现dhcp和tftp),cobbler
②OS config(命令批量运行,保持任务执行的状态):puppet saltstack(灵活性不如ansible)
③:Task Excute(命令任务执行的工具,独立出来,效率比较高):fabric func saltstack
④:Deployment(实现应用程序部署):fabric (高版本ansible完全可以取代)
ansible 可以实现 OS config 、 Task Excute Deployment 是属于轻量级的自动化运维工具。
Ansible 不可以实现 pxe 功能,因为他是操作系统功能,要自动化操作系统
基于管理节点和被管理节点模式,需要考虑安全因素。
**运维工具的远程管理分类:**服务端/客户端
无客户端 ,以SSH 服务 来操控(需要账户和相关管理员权限) ansible 属于此类。
2 : ansible 简介
2012年诞生的新兴的开源自动化运维工具,基于python语言开发,源代码托管在github上,是目前最受欢迎的自动化运维工具之一,排名前十。
由Paramiko,PyYAML和jinjia2三个关键模块来融合了众多功能。
**三大核心组件:**Paramiko实现核心功能、PyYAML实现剧本相关功能、jinjia2实现模版技术
3 : ansible 功能
批量执行远程命令,可以对远程的多台主机同时进行命令的执行
批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
编排高级的企业级复杂的IT架构任务,Ansible的Playbook和role可以轻松实现大型的IT复杂架构
提供自动化运维工具的开发API
4 : ansible 的特性
①:minimal learning curve(最小学习曲线) auditability(可认证的) 基于Python语言来实现
②:Modules in any language(支持多模块化,模块支持任意编程语言)
centos7有3378模块、rocky8有5000多模块,rocky9:72个模块
③:Paramiko(python对ssh的实现),PyYAML,jinja2(模板语言)三个关键模块
④:No bootstrapping(无需客户端引导,客户端只要支持ssh协议就行)
⑤:No DAG ordering,Fails Fast(无依赖关系)幂等性,一个任务执行1遍和执行N遍效果一样,不因重复执行带来意外情况(非绝对)
⑥:No agents(没有代理)
⑦:No server(没有服务器端)
⑧:安全,基于openssh,No additional PKI(无需依赖证书)
⑨:yaml,not code(简化的标签格式定义文档文本格式,学习简易)
⑩:strong multi-tier solution (支持多角色)
最主要核心模块Paramiko(python对ssh的实现)本质:
管控机基于ssh协议控制受控机,做完参数之后,在受控机用户家目录会生成一个.ansible,会生成一个.py;受控完毕之后,就会把这个.py文件删除
幂等:相当于脚本可以重复执行,且不报错
TFTP:简单文件传输,走UDP
5: ansible 核心组件(重点)
①:ansible core
②:host iventory 主机池(主机清单就受控记的主机名或者ip地址,必须写到管控机inventory中)
③:core modules 核心模块
④:custom modules 自定义模块
⑤:playbook(yaml jinjia2) 运行将多个主机的配置的任务写在yaml格式的配置文件中,支持python的jinjia2模板语言
⑥:connect plugin(连接每个管理主机的插件)
⑦:API(第三方应用程序调用的编程接口)
二、ansible的原理以及语法
1.流程:
①用户可以调用命令,先去找主机清单(找受控机)、其次去调用模块,任务模块去调用API(这时会涉及到一些第三方插件),去对Windows主机或者网络设备做控制。
②用户可以调用剧本,然后剧本调用主机清单和模块
ansible部署简单,无需客户端,使用ssh协议来实现管理。基于主从模式(非应用程序管理)
ansible以"模块"完成各种"任务";支持自定义模块,支持各种编程语言
2.ansible 命令语法
ansible 支持分类列表、支持主机ip, 支持正则表达式
ansible <host-pattern> [ -f forks ] [-m module_name] [-a args]
host-pattern:表示对哪些主机生效
-f forks:一次性处理多少主机(启动并发线程数)
-mmodule_name:要使用的模块
-a args :传输模块特有的参数
-v:显示详细信息
**-C:**检测运行模式(测试执行)
**-i:**指明主机清单文件是谁(默认为/etc/ansible/hosts)
**-k:**基于ssh密码传输(非基于Key认证)
**--list:**列出对执行的所有主机
**--syntax-check:**对playbook剧本实现语法检测
连接相关选项
-c CONNECTION:使用什么方式连接目标主机,默认为smart
-u REMOTE USER:指定目标主机连接的用户名,默认为None
权限升级方式选项
-s 普通用户提权(sudo)
简单操作:必须定义主机清单
支持通配符,逻辑与,逻辑或正则表达式
ansible-doc -l:列出所有模块 -s:查看模块用法
【注】:操作必须是幂等的
三、ansible常见模块
1.command 命令模块(默认模块,用于在远程执行命令,不能使用变量,也不支持幂等,不支持管道。)
ansible all -a 'cat /etc/issue'
2. : shell : 运行命令管理模块 (用于管道等复杂命令,也不支持幂等)
ansible all -m shell -a 'echo $HOSTNAME'
3. user :
name=:指明创建用户的名字
remove=yes/no 缺省值为no
4. group
ansible-doc group(空格往下翻)
ansible all -m group -a 'name=public gid=2500'
5.copy
src=:定义本地源文件路径
dest=:定义远程目标文件路径 以上都需要使用绝对路径
content=:取代src=,表示自定义文本的内容直接取代拷贝的文本文件内容信息
owner=:指定属主
group=:指定属组
mode=:指定权限
例:把anaconda-ks.cfg复制到被控机/mnt,并且需要改名为a.cfg
ansible all -m copy -a 'src=/root/anaconda-ks.cfg dest=/mnt/a.cfg mode=400'
【注】:后面补 / 是目录,不补 / 是文件
在被控机进行检验:
6.fetch : 拉取远程主机文件到本地
注意:不能拉取目录
src=:远程主机路径下的源文件
dest=:拉取到本地目标文件路径下的文件 以上都需要使用绝对路径
ansible-doc fetch //fetch的帮助文档
例:将110的rocky环境拉倒本地(为了防止拉相同文件,弄混,自动创建了文件夹,方便管理)
ansible 192.168.10.110 -m fetch -a 'src=/root/rocky9_huanjing.sh dest=/tmp/rocky9_huanjing.sh'
7. file : 主要作用于文件管理
path=:指定文件路径,可以使用name或dest来替换
state=touch/directory/link/absent 创建文件/目录/软链接/删除
创建链接: src= : path= :指明符号链接文件路径
例:删掉/mnt/目录
8.hostname : 更改主机名
name= :新主机名
9. Get_url : URL 下载模块
功能:用于将文件从http、https或者ftp下载到被管理节点
url=:被下载文件的URL
dest=:下载到目标路径(绝对路径)
owner=:指定属主
group=:指定属组
mode=:指定权限
force=:如果是yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件。
checksum=算法:对目标文件下载后计算摘要,以确保其数据的安全性和完整性
例:checksum=md5:xxxxxx
ansible all -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'
例:校验码如果比对不匹配,则会报错;
10. archive 和 unarchive : 压缩和解压缩模块
src=:源压缩文件(可以是从网上直接下载的url)
copy=no:不在我的主机上,yes在我的主机上
dest=:目标解压缩文件路径
format=:目标压缩文件格式
【注】:归档压缩 path= 源被压缩文件或目录 dest= 压缩之后的归档文件以及所在的路径
11.script:运行本地脚本模块
12. yum : 安装程序包模块(当然,需要事先配置好 yum 源)
name=:指明要安装的程序包,可以接上版本号
state=:present,latest表示安装(默认值--最新版本),absent表示卸载
例:ansible all -m yum -a 'name=httpd state=latest'
在被控机上进行验证查看:
13. cron :
name=" 计划任务的名字 " 分、时、日、月、周、用户名、指令
job= 作业执行的程序内容
State(状态) present:安装 (默认)absent:移除
例:ansible all -m cron -a 'name="this is new job" job="/usr/bin/touch /root/1.txt" minute=0 hour=1 day=1 month=3'
在被控机上进行验证查看:
14. ping : 网络连通性
ansible all -m ping
【注】:不接-m,等于调用command模块,command模块不支持幂等,严重不推荐
15. service 、 systemd : 服务启停管理模块,不可以管 unix 单元
enabled=:是否开机自动启动 (true false)
name=:服务名称
state=:状态,取值有started,stopped,restarted
例:首先安装nginx,然后设置开机自启
ansible all -m yum -a 'name=nginx state=present' //安装nginx
ansible all -m system -a 'name=nginx state=started' //启动nginx
ansible all -m system -a 'name=nginx state=stopped' //停止nginx
在被控机上测试查看:
16. lineinfile :支持某一行的字符转移替换
path=:
regexp=:正则表达式(如果不知道精确到哪一行,所以全部都修改)
line=:要修改的行
例:ansible-doc lineinfile //查看lineinfile的帮助文档
ansible 192.168.10.110 -m fetch -a 'src=/etc/nginx/nginx.conf dest=/root/'
ansible 192.168.10.110 -m lineinfile -a "path=/etc/nginx/nginx.conf regexp='^[ ]+(root).*' line=' root/nginx/html;'"
ansible 192.168.10.110 -m lineinfile -a "path=/etc/nginx/nginx.conf regexp='^[ ]+(root).*' line=' \1 /nginx/html;'backrefs=yes"
被控机测试查看:
17. replace :支持全文匹配的字符转移替换(需要写入完整的正则表达式)
path=:
regexp=:正则表达式
replace=:要替换的行
例:
ansible 192.168.10.110 -m lineinfile -a "path=/root/1.txt regexp='^i.*' line='liang nian ban'"
被控机查看:
全部替换
ansible 192.168.10.110 -m replace -a "path=/root/1.txt regexp='(liang)(.*)' replace="san\2"
被控机查看:
18. setup : 收集每个远程主机的 fact
每个被管理节点在接收并运行管理命令之前,会将自己的主机相关信息,如操作系统版本, IP 地址等报告给 ansbile 主机
例如:ansible all -m setup 发送过来所有的远程主机的所有信息。
Ansible 192.168.10.110 -m setup
Yum -y install ansible --nobest
ansible --version
ansible-doc -l | wc -l