Ansible
Ansible简介
【管理机----业务机】
ansible是什么
ansible—-自动化运维工具
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
优点及特点:
Ansible优点:
-
Ansible是一款开源运维自动化工具,可以实现运维自动化,提高运维工程师的工作效率,减少人为失误;
-
Ansible可以通过本身集成的非常丰富的模块实现各种管理任务,其自带模块数量已超过上千个
-
Ansible操作非常简单,即使新手也比较容易上手
-
Ansible提供的功能却非常丰富,在运维领域,几乎可以实现任何事情。
Ansible 特点 Ansible自2012年发布以来,很快在全球流行,其特点表现如下:
-
Ansible 基于python开发,集合了众多运维工具的优点,运维工程师对其二次开发相对较容易;
-
Ansible 拥有丰富的内置模块,基本可以满足一切要求;
-
管理模式非常简单,一条命令可以影响上千台机器;
-
无客户端模式设计,底层基于SSH通信; Ansible发布后也陆续被AWS,Google Cloud Platfrom,Microsoft Azure,Cisco,HP,Mware.Twitter 等大公司接纳并投入使用;
常见自动化运维工具
常见的运维工具有puppet、ansible、saltstack,重点介绍最常用的自动化运维工具ansible
常见的运维自动化工具
-
Puppet
-
Ansible
-
SaltStack
三款自动化运维工具对比
(表格内容 来源于:腾讯云 作者:咻一咻)
名称 | Puppet | SaltStack | Ansible |
---|---|---|---|
开发语言 | Ruby | Python | Python |
客户端 | 有 | 有 | 无 |
二次开发 | 不支持 | 支持 | 支持 |
通信验证 | 是 | 是 | 是 |
同学加密 | 标准SSL协议 | AES加密 | OpenSSH |
平台支持 | AIX,BSD,HP-UX,Linux,Mac OS X,Solaris,Windows | BSD,Linux,Mac OS X,Solaris,Windows | AIX,BSD,HP-UX,Linux,Mac OS X,Solaris |
配置文件格式 | Ruby语法格式 | YAML | YAML |
Web UI | 提供 | 提供 | 提供(商业版本) |
命令执行 | 不支持(配置模块可实现) | 支持 | 支持 |
名称 | 优势 | 劣势 |
---|---|---|
Puppet | 模块由Ruby或Ruby子集编写,push命令可以即刻触发变更,Web界面生成处理报表、资源清单、实时节点管理代理运行端进行详细、深入的报告和对节点进行配置 | 相对其他工具较复杂,需学习Puppet的DSL或Ruby安装过程缺少错误校验和产生错误报表 |
Saltstack | 状态文件可用简单YAML配置模块,或复杂的Python/PyDSL脚本,与客户端可以基于SSH,或在被管节点安装代理,Web界面可看到运行的工作、minion状态、事件日志、可在客户端执行命令扩展能力极强 | Web界面像毒药竞争产品不稳定与相对不完善缺乏生成深度报告的能力 |
Ansible | 模块可以用任何语言开发;备管节点不需要安装代理软件,有Web管理界面、可配置用户、组、资源清单和执行Playbook安装、运行极其简单 | 对备管理节点为Windows有待加强Web管理界面是内置的Ansible的一部分需导入资源清单执行效率较低 |
ansible优势:
一次性任务定制:任务一次性发布给所有机器
节省任务执行时间:任务主机并发完成任务,节省部署时间
错误率低:避免重复,保证一次任务定制准确即可
方便,操作简单
(ansible仅依赖)ssh
只需要集群管理服务器上安装ansible
ssh 免密钥登录
分组管理:
三种不同环境:
dev 开发服务器 develop(敏捷开发---快速上线项目,边用边改;)
qa 测试服务器 quality (测试原理:黑盒测试、白盒测试)
prod 生产服务器 production
灰度发布(测试服务器)
部分发布
ansible安装 实验环境:
主机名称 | IP地址 |
---|---|
manage01(管理) | 192.168.8.20/24 |
node1 | 192.168.8.21/24 |
node2 | 192.168.8.22/24 |
node3 | 192.168.8.23/24 |
manage01上操作:
切换到/etc/yum.repos.d中
1.[root@manage01 ~]# yum -y install epel-release
(这一步不成功,可以去192.168.3.200局域网复制 local.repo链接,切换到cd /etc/yum.repos.d下面,wget +链接;
http://192.168.3.200/mirrors/local.repo
查看yum源里是否有该软件包 yum info ansible
安装软件
2.安装ansible
[root@manage01 ~]# yum -y install ansible
安装好之后可以查看版本 ansible --version
3.[如果想不需要运维人员干预,被管理端必须允许管理端证书免密登录。]
管理端manage01生成密钥对
ssh-keygen
查看密钥:cd /root/.ssh
切换到该目录下查看:ls
4.切换到 cd /root/.ssh
发送公钥
方式一:交互式传送
[root@manage01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.8.23
方式二:非交互式传送,
安装yum -y install sshpass
sshpass -proot123 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@192.168.8.21
sshpass -proot123 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@192.168.8.22
sshpass -proot123 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@192.168.8.23
*起别名,就不用记IP了,方便以后管理; cd /etc/
vim /etc/hosts
测试证书是否生效
[root@manage01 ~]# for i in seq 21 23
;do
>ssh root@192.168.8.$i "hostname"
>done
node1
node2
node3
5.切换到 cd /etc/ansible 下,编辑文件hosts,里面可添加IP,也可分组添加IP
1)直接添加IP
192.168.8.12
2)添加连续IP
192.168.8.[12:15]
3)添加小组IP,组名+IP
[group1]
192.168.8.12
192.168.8.13
6..测试管理机和业务机的连通性
1)测试一台
ansible -m ping 192.168.8.21 -k
-k 交互式输入,需要输入密码
2)测试一组
ansible -m ping group1
3)测试管理的所有机器
ansible -m ping all
其他概念
主机清单 inventory
【/etc/ansible/hosts ansible的主机清单,也可以自己划分主机清单,主机清单是可以配置很多份的】
创建主机清单/关于业务主机分组
touch /root/new_hosts
[web]
node1
node2
lvs1 ansible_ssh_host=192.168.8.200 ansible_ssh_pass=root123
-
查看清单有效内容:
egrep -v “^$|^#” /etc/ansible/hosts
-
查看以server开头的内容
[root@manage01 ~]# egrep "^server" /etc/chrony.conf
根据环境可以设置不同的主机清单,测试是否能ping通;
ansible -i /root/new_hosts web -m ping
机器分组实验步骤
【具体步骤】
-
在 vim /etc/hosts 里面添加对应的主机名和IP;
192.168.8.12 node1
192.168.8.13 node2
192.168.8.14 node3
-
自己添加主机清单,并在里面设置分组
vim /root/new_hosts
[web]
node1
node2
-
测试连通性
ansible -i /root/new_hosts web -m ping
关于业务机器分组
分组中使用范围
[nginx] 组名
apache[1:10].aaa.com
表示apache1.aaa.com到apache10.aaa.com这10台机器
nginx[a:z].aaa.com
表示nginxa.aaa.com到nginxz.aaa.com共26台机器
10.1.1.[11:15]
表示10.1.1.11到10.1.1.15这5台机器
指定业务机器别名,未做免密登陆的机器可以通过下面的机器设置账号密码
nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456"
ansible_ssh_host 指定业务机器的IP或域名
ansible_ssh_port 指定业务机器的ssh端口
ansible_ssh_user 指定业务机器的ssh用户名
ansible_ssh_pass 指定业务机器的ssh用户名密码
#分组 [group1] 192.168.8.21 #未做免密登陆机器 192.168.8.22:12121 ansible_ssh_user=sko ansible_ssh_pass='123' #别名机器 web1 ansible_ssh_user=sko ansible_ssh_pass='123'
ansible命令参数
ansible -i 参数的路径
-i 参数指定主机清单
-C 测试但不执行,使用剧本时,可以测试剧本功能
ansible配置文件
管理端ansible目录:/etc/ansible
[root@manage01 ansible]# tree . ├── ansible.cfg #ansible配置文件,不需要配置 ├── hosts #主机列表 └── roles #角色列表 1 directory, 2 files
Ansible命令的格式
ansible 机器 -m 模块名称 -a '模块参数'
ansible 192.168.8.12 -m hostname -a “name=abcd”
基本格式为:
ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2"
ansible基本模块
hostname模块
修改主机名
ansible 192.168.8.12 -m hostname -a “name=abcd”
正确演示:
错误案例:错误原因,“” 符号有错误
file模块
可以创建文件、目录、链接……
等价于touch、chmod、chown…
参数 | 说明 |
---|---|
path | 文件绝对路径 |
state | 操作(touch文件新建、absent删除、link软连接、hard硬链接、directory目录创建) |
owner | 设置所有者 |
group | 设置所属的组 |
mode | 权限 0000 |
recurse | 递归 yes or no,用于递归设置权限,不能删除文件(chmod root:root -R,相当于R) |
src | 软硬链接的原始文件路径 |
例1:state=directory 在group1上创建一个目录,属主属组为root,权限700,路径/root/tom
ansible group1 -m file -a “path=/root/tom state=directory owner=root group=root mode=700”
例2:对单独一台机器操作
ansible 192.168.8.12 -m file -a “path=/root/tom state=directory owner=root group=root mode=700”
![image-20240410150025969](C:\Users\联想小新\Desktop\vx图片\image-20240410150025969.png
-
state=absent 删除空目录,操作完 bash 刷新一下,node1查看结果;
ansible 192.168.8.12 -m file -a "path=/root/tom state=absent "
例3:在主机192.168.8.12上,创建属主属组为zjx的目录(192.168.8.12上必须有zjx用户)
例4:递归创建
copy模块
把本地文件拷贝到远程服务器上,使用sftp
参数 | 说明 |
---|---|
src | 文件源路径 |
dest | 目标路径 |
content | 往目标文件输入内容 |
force | 强制 yes or no,默认强制覆盖模式; |
backup | 是否备份有冲突的源文件[文件名相同,内容不同] yes or no |
checksum | 拷贝完整性校验,使用sha1sum生成校验码 |
owner | 目标文件所有者 |
group | 目标文件所属组 |
mode | 目标文件权限 |
例1:复制文件内容
方法一:简便方法;
将管理机上的/root下a.txt文件复制到192.168.8.12主机上
ansible -m copy group1 -a “src=/root/a.txt dest=/tmp/”
src自己的文件路径,dest对方的文件路径
例2:[root@manage01 ~]# ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'
/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
例3:root@manage01 ~]# ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'
/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
方法二:创建文件,生成校验码,copy操作
[root@manager01 tmp]# sha1sum hhh.txt f53126f18c2571ecec28ccf968fa9f9a7d6904d8 hhh.txt
[root@manager01 tmp]# ansible -m copy 192.168.8.12 -a "src=/tmp/hhh.txt dest=/opt checksum=f53126f18c2571ecec28ccf968fa9f9a7d6904d8 owner=zjx group=zjx mode=0400"
content
-
使用content参数直接往远程文件里写内容(会覆盖原内容);将内容直接添加到远程服务器文件中
先创建内容<file模块>------<comment>追加
[root@manager01 ~]# ansible -m file 192.168.8.12 -a "path=/code state=touch"
[root@manager01 ~]# ansible -m copy 192.168.8.12 -a "content='baism\nhello world\n' dest=/code"
force
使用force参数控制是否强制覆盖;不写默认强制覆盖;
[root@manager01 ~]# ansible -m copy group1 -a "content=666666 dest=/tmp/zuolaoshi_333 force=yes"
backup 备份
force=yes backup=yes 强制覆盖时会先备份;
backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
如果拷贝过来的文件本机存在,group1的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333
[root@manage01 ~]# ansible group1 -m copy -a "src=/etc/fstab dest=/tmp/zuolaoshi_333 backup=yes"
fetch 与copy模块类似,但作用相反
用于把远程机器的文件拷贝到本地。只能拷贝文件不能拷贝目录;
[root@manager01 ~]# ansible -m fetch 192.168.8.12 -a "src=/tmp/zuolaoshi_333 dest=/tmp"
user模块
user模块用于管理用户账号和用户属性
常用参数 | 说明 |
---|---|
name="" | 指定用户名 |
password="" | 指定密码,必须是密文 |
state= absent|present | 删除|创建 |
system= yes|no | 是否为系统用户 |
shell="" | 指定登陆shell |
generate_ssh_key= yes|no | 是否创建秘钥对 |
uid= | 指定用户的uid |
append= yes|no | 用户是否追加到其他组 |
group= | 用户属组 |
groups= | 将现有用户加入到某个组,空值就会把该用户从所有所属组中删除 |
create_home= yes|no | 是否建立家目录 |
remove= yes|no | 删除家目录 |
创建新用户:
密码必须是密文,所以先要把明文转换一下,生成md5密文 [root@manage01 ~]# echo 123|openssl passwd -1 -stdin
$1$5V.qzSEd$Yr08MU8K.vXeBZcmavypk1
[root@manage01 ~]# ansible -m user group1 -a 'name=sky password="$1$5V.qzSEd$Yr08MU8K.vXeBZcmavypk1" state=present system=yes shell=/sbin/nologin generate_ssh_key=yes'
验证:
在对应的业务机上 cat /etc/shadow
用户删除
[root@manage01 ~]# ansible -m user 192.168.8.21 -a "name=baishuming1 state=absent remove=yes"
systemctl=yes 系统用户
注:
1)最外层:有$符号时,最外层使用单引号可以生成密码
$变量名 在Linux中获取变量的值;
“$var”在双引号中会显示结果
‘$var’表示$var本身
group模块
group模块用于管理用户组和用户组属性。
参数 | 说明 |
---|---|
name= | 组名 |
state= present|absent | 创建|删除 |
system= yes|no | 是否为系统组 |
gid | gid |
组创建
[root@manage01 ~]# ansible -m group group1 -a "name=admin gid=4444 state=present"
用户添加进组
[root@manage01 ~]# ansible -m group group1 -a "name=zjx append=yes group=admin state=present"
删除组
[root@manage01 ~]# ansible -m group group1 -a "name=admin gid=4444 state=absent"
cron 模块
cron模块用于管理周期性时间任务。
参数 | 说明 |
---|---|
name | 计划任务的名称 |
user | 执行计划任务的用户 |
job | 计划任务命令 |
minute | 执行计划任务的分 默认为* |
hour | 执行计划任务的时 默认为* |
day | 执行计划任务的日 默认为* |
month | 执行计划任务的月 默认为* |
week | 执行计划任务的周 默认为* |
state absent | 删除计划任务 |
设置定时任务: 10:23完成名叫:cron test的定时任务;任务内容为:将haha输入到 /tmp/test中 [root@manage01 ~]# ansible -m cron group1 -a 'name="cron test" user=root job="echo haha > /tmp/test" minute=23 hour=10' [root@manage01 ~]# ansible -m cron group1 -a 'name="cron test" user=root job="echo haha > /tmp/test" minute=23 hour=10' 删除定时任务
yum repository
yum_repository模块用于配置yum仓库。
参数 | 说明 |
---|---|
name | 仓库名 name.repo 源的名称 [name] |
description | 描述 |
baseurl | 包下载路径 |
gpgcheck= 1 or 0 | 包gpg验证 |
enabled = yes|no | 是否开启本源 |
state= absent | 删除源 |
增加一个/etc/yum.repos.d/dvd.repo配置文件
配置yum源,会多一个dvd.repo配置文件 [root@manage01 ~]# ansible -m yum_repository group1 -a "name=dvd description=BaseOS baseurl=file:///media/cdrom gpgcheck=0 enabled=yes" 删除某个yum源 state=absent
yum模块
yum模块用于使用yum命令来实现软件包的安装与卸载。
参数 | 说明 |
---|---|
name | 需要安装软件包的名称 |
list= installed, updates, available and repos | 列出已安装 需要更新 可获得的 和 yum源 |
state= absent removed installed present latest | 删除、删除、安装确认、安装确认、安装最新版本 |
使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)
例1:用yum安装软件,安装ftp,安装最新版本; [root@manage01 ~]# ansible -m yum group1 -a "name=ftp state=latest" 安装好之后测试: 输入ftp 删除软件: state=absent
service 模块
service模块:用于控制服务的启动,关闭,开机自启动等。
参数 | 说明 |
---|---|
name | 服务名称 |
state reloaded, restarted, started, stopped | 服务管理 |
enabled yes|no | 开启是否启动 |
例:
删除镜像
ansible group1 -m shell -a “rm -rf /etc/repos.d/*.repo”
下载本地镜像
ansible group1 -m get_url -a “url=http://192.168.3.200/mirrors/local.repo dest=/etc/yum.repos.d”
挂载镜像
ansible group1 -m shell -a “mkdir -p /media/cdrom && mount /dev/cdrom /media/cdrom”
加载缓存
ansible group1 -m shell -a “yum makecache”
yum安装vsftpd
ansible group1 -m yum =a “name=vsftpd state=latest”
启动vsftpd
ansible group1 -m service -a “name=vsftpd state=started”
关闭vsftpd
ansible group1 -m service -a “name=vsftpd state=stoped”
删除软件包
ansible group1 -m service -a “name=vsftpd state=absent”
查看是否加载缓存:
ps -aux |grep yum
*script 模块
让远程服务器,执行我们本地的shell脚本
1.在管理机上创建一个脚本ansible_test.sh
[root@manage01 ~]# cat ansible_test.sh #!/bin/bash #ansible script module test script mkdir /opt/log find / -name "*.log" -exec cp -a {} /opt/log \;
2.执行命令
ansible group1 -m script -a “/root/ansible_test.sh”
command和shell模块
区别:shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)
shell模块
[root@manage01 ~]# ansible -m shell 192.168.8.21 -a "ls /root"
command模块
[root@manage01 ~]# ansible -m command 192.168.8.21 -a "ls /root"
setup 模块
setup模块用于收集远程主机的基本信息(如操作系统类型,主机名,ip,cpu信息,内存信息等)
#打印192.168.8.21机器的所有信息 [root@manage01 ~]# ansible -m setup 192.168.8.21 #使用filter过滤输出 #打印192.168.8.21机器的CPU信息 [root@manage01 ~]# ansible -m setup 192.168.8.21 -a "filter='ansible_processor'"
其它常见的过滤条件 ansible_all_ipv4_addresses:显示ipv4的信息。 ansible_devices:显示磁盘设备信息。 ansible_distribution_major_version:显示是系统主版本。 ansible_distribution_version:仅显示系统版本。 ansible_machine:显示系统类型,例:32位,还是64位。 ansible_lvm:显示lvm相关信息。 ansible_memtotal_mb:显示系统总内存。 ansible_memfree_mb:显示可用系统内存。 ansible_memory_mb:详细显示内存情况。 ansible_swaptotal_mb:显示总的swap内存。 ansible_swapfree_mb:显示swap内存的可用内存。 ansible_mounts:显示系统磁盘挂载情况。 ansible_processor:显示cpu个数(具体显示每个cpu的型号)。 ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
stat 模块
stat模块类似linux的stat命令,查看文件的状态信息。
知识补充:
所有密码存储位置:
vim /etc/shadow
所有用户位置:
vim /etc/passwd
所有组位置:
vim /etc/group
linux用户可以分为3类:
root 管理员用户,admin 当uid=0 gid=0时为超级管理员;
uid 1-999 为系统用户,一般不能登录,用于目录的权限和运行软件
uid 1000+ 普通用户,可以登录
get_url用于下载文件
类似于wget
-
远程下载模块
ansible group1 -m get_url -a “url= dest=”
-
远程删除模块
ansible group1 -m shell -a “rm /root/mysql*”
-
远程查看
ansible group1 -m shell -a
“ls”
-
远程查看IP(-a 不能识别特殊符号,若有特殊符号 需要加 -m shell)
ansible group -a “ip ad sh”
ansible 如何查询
ansible-doc copy
ansible-doc file
ansible剧本
很像shell脚本
playbook是将模块进行组合使用,批量的实现复杂功能。
常用的配置文件格式
-
ini== conf
1)系统的配置文件,初始化文件
2)yum源,mysql配置
[mysqld]
[mysql]
-
Json
1)网络数据传输
2)html+css+js http/https json
3)java,python,go,php,c++ json
-
yaml
1)缩进统一,同一级别属性书写必须对齐,只能用空格进行缩进;
2)前后端项目的配置文件
-
xml可扩展标记语言
1)java项目和早期的项目比较流行
2)类似于Html的格式
3)apache 旗下的各种软件应用,httpd,tomcat
yaml
注意事项:
缩进使用空格,同一级别属性对齐,否则会报错;下一级属性使用两个空格进行缩进。
剧本格式
例1:
--- - name: test hosts: group1 remote_user: root var: - name:tom tasks: - name: test ping ping: - name: test copy copy: src=/root/apache.yml dest=/root/ - name : useradd {{name}} #x获取变量的值 相当于$name user: name="{{name}}" state=present
ansible-playbook -C apache.yml -C检测功能
ansible-playbook apache.yml 执行
一:tasks 任务
任务在一行可以用等于号;
name: test hosts: group1 tasks: - name: test ping ping: - name: test copy copy: src=/root/apache.yml dest=/root/多行用 冒号
name: test hosts: group1 tasks: - name: test ping - name: test copy copy: src: /root/apache.yml dest: /root/方法一:
方法二:
二:handlers notify调用执行,
handlers 最佳使用场景:重启服务
三:循坏: with_items
role
分角色写剧本
httpd
php
mysql
httpd+php
mysql+php
http+mysql
http+php+mysql
其他服务也可以写,我们还学过:
nfs,httpd,nginx,lvs,keepalive,redis,php,mysql,ftp,samba,dns,ntp,dhcp,rsync
roles优点:
1)模块中指令较少,方便编写
2)重复调用方便
3)排错方便
怎么创建角色
每个角色都需要有一个剧本;
创建LAMP剧本(yum)
roles的默认路径:
/etc/ansible/roles
6个目录结构:切换到该目录下,需要写角色,每个角色包括
files:用来存放由copy模块或script模块调用的文件。 tasks:至少有一个main.yml文件,定义各tasks。 handlers:有一个main.yml文件,定义各handlers。 templates:用来存放jinjia2模板。 vars:有一个main.yml文件,定义变量。 meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.
ansible-playbook中调用脚本
实现调用执行shell脚本并传参
主从服务器主要区别:配置文件不一样; 主服务器:追加主服务器的配置文件 从服务器:追加从服务器的配置文件 通过不同参数来实现 -e 传参,name变量名 ansible-playbook test.yml -e name="-s" 执行:ansible-playbook test.yml