网站集群批量管理-Ansible(ad-hoc)

1. 概述

  1. 自动化运维: 批量管理,批量分发,批量执行,维护

  2. 无客户端,基于ssh进行管理与维护

2. 环境准备

|---------|------------------|
| 环境 | 主机 |
| ansible | 10.0.0.7(管理节点) |
| nfs01 | 10.0.0.31(被管理节点) |
| backup | 10.0.0.41(被管理节点) |

2.1 创建密钥认证

安装sshpass

yum install -y sshpass

bash 复制代码
#!/bin/bash
##############################################################
# File Name:24-ssh.sh
# Version:V1.0
# Author:xzb996
# Organization:www.oldboyedu.com
# Desc:一键创建密钥对,分发密钥对
##############################################################
##1.vars
pass=1
ips="10.0.0.31 10.0.0.41"

##2.创建密钥对
if [ ~/.shh/id_rsa] ;then
  echo "已经有密钥对了"
else
  echo "正在创建密钥对"
  ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
fi

##3.通过循环发送密钥对
for ip in $ips
do 
   sshpass -p${pass} ssh-copy-id -i ~/.ssh/id_rsa.pub -oStrictHostKeyChecking=no $ip &>/dev/null
   echo "$ip 密钥已发送..."


done 

3. 部署与配置

bash 复制代码
 yum install -y ansible 

3.1 配置

修改配置文件关闭主机Host_key_checking .

修改配置文件开启日志功能

4. Ans-inventory主机清单

  1. ansible默认读取在/etc/ansible/hosts文件,并非/etc/hosts.

2.未来实际使用中一般我们会把主机清单文件存放在指定的目录中,运行ansible的时候通过-i选项指定主机清单文件即可

4.1 主机清单必会格式

主机清单格式:

分类或分组的名字\] #注意分类要体现出服务器的作用 ip地址或主机名或域名 #注意主机名要能解析才行

4.1.1 对主机分组并进行连接测试

bash 复制代码
##vim编辑后用gg+dG清空文件内容
[nfs]
172.16.1.31
[backup]
172.16.1.41

测试

ansible命令格式:

ansible 主机ip或分组或all -m 指定使用的模块名字

这里的ping模块用于检查被管理端是否可以访问

4.2 子组

创建新的分组data包含已有的分组backup和nfs

bash 复制代码
[nfs]
172.16.1.31
[backup]
172.16.1.41
##c创建data的子组
[data:children]
nfs
backup

子组使用children关键词创建

格式:

data:children\] #组名字:children即可

4.3 指定用户,密码

不推荐,推荐先配置密钥认证,然后管理

没有配置密钥认证,主机清单如何书写?

bash 复制代码
[nfs]
172.16.1.31 ansible_user=root  ansible_password=1 ansible_port=22 ##指定用户名,密码,端口

5.Ansible模块

1.Ansible中通过各种模块实现批量管理.

2.一般来说这些模块对应着Linux里面的基本操作或服务管理

  1. 找出Linux场景操作对应的模块即可

5.1 命令与脚本类模块

5.1.1 command模块

是ansible默认的模块,适用于执行简单的命令,不支持特殊符号

批量获取所有主机的主机名
bash 复制代码
ansible all -m command -a 'hostname'

5.1.2 shell模块

批量获取所有主机的IP地址
bash 复制代码
ansible all -m shell -a "ip a s eth0 |awk -F'[ /]+' 'NR==3{print \$3}'"

shell模块不推荐执行较为复杂的指令,如果需要执行放在脚本中执行

5.1.3 script模块

1.分发脚本(传输脚本)

2.运行脚本

批量执行脚本获取主机信息
bash 复制代码
#!/bin/bash
##############################################################
# File Name:25-ansible-script.sh
# Version:V1.0
# Author:xzb996
# Organization:www.oldboyedu.com
# Desc:系统巡检脚本
##############################################################
hostname
hostname -I
uptime 
whoami
date +%F
bash 复制代码
ansible all -m script -a '/server/scripts/25-ansible-script.sh'

5.2 文件相关模块

管理文件,管理目录,软连接

|--------|------------------------------------------------------------------------------------------------|
| file模块 | 模块说明 |
| path | 路径(目录,文件) 必须要写 |
| src | 源文件一般用于link(创建软连接模式) 用于指定源文件 |
| state | 状态(模式) state=directory 创建目录 state=file (默认) 更新文件,如果文件不存在也不创建 state=link 创建软连接 state=touch 创建文件 |
| state | state=absent 删除 (注意如果是目录递归删除目录) |
| mode | mode=755创建并修改权限 |
| onwer | onwer=root |
| group | group=root |

创建/tmp/xzb666.txt
bash 复制代码
ansible all -m file -a 'path=/tmp/xzb66.txt state=touch'
创建目录/app/
bash 复制代码
ansible all -m file -a 'path=/app/xzb/xzb666 state=directory'
创建软连接 /etc/hosts创建软连接到/tmp/下
bash 复制代码
ansible all -m file -a 'path=/tmp/hosts src=/etc/hosts state=link'
创建/ans-backup目录 所有者是oldboy
bash 复制代码
ansible all -m file -a 'path=/ans-backup owner=oldboy group=oldboy mode=700 state=directory'
删除/ans-backup/
bash 复制代码
ansible all -m file  -a 'path=/ans-backup state=absent'

5.3 copy模块

批量分发:scp

copy模块
src source 源文件
dest destination 目标
backup backup=yes 则会在覆盖前进行备份
mode 修改权限
owner 修改为指定所有者
group 修改为指定用户组
bash 复制代码
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'

5.4 服务管理模块-systemd

1.相当于是systemctl 命令:

开启/关闭/重启服务

开机自启动

systemd模块
name 用于指定服务名称
enabled yes开机自启动
state 表示服务开,关,重启 state=started 开启 state=stopped 关闭 state=reloaded 重读配置文件(服务支持) state=restarted 重启(关闭再开启)
daemon-reload yes是否重新加载对应的服务的管理配置文件
启动服务crond
bash 复制代码
ansible all -m systemd -a 'name=crond enabled=yes state=started' 
关闭firewalld服务
bash 复制代码
ansible all -m systemd -a 'name=firewalld enabled=no state=stopped'

5.5 软件管理模块

5.5.1 yum模块

|--------------|-------------------------------------------------------------|
| yum模块 | |
| name | 指定软件包名字 |
| state | installed 安装(present)(默认) removed 删除 (absent) lastest 安装或更新 |
| update_cache | 可以设置为no加加速,表示不更新本地yum缓存.实际应用建议开启 |

安装htop,tree,lrzsz,sshpass服务
bash 复制代码
ansible all -m yum -a 'name=htop,tree,lrzsz,sshpass'

5.5.2 get_url模块

|-------------|----------|
| get_url下载功能 | |
| url | 指定要下载的地址 |
| dest | 下载到哪个目录 |

https://tengine.taobao.org/download/tengine-2.4.1.tar.gz下载到/app/tools
bash 复制代码
ansible all -m get_url -a 'url=https://tengine.taobao.org/download/tengine-2.4.1.tar.gz dest=/app/tools'

5.5.3yum_repository模块

有点鸡肋,未来可以书写好yum配置文件,copy分发过去即可。

|------------------|------------------------------|
| yum_repository模块 | yum源 |
| name | yum源中名字 []里面的内容 |
| description | yum源的注释说明 对应的 是name的内容 |
| baseurl | yum源中baseurl下载地址 |
| enabled | 是否启动这个源 yes/no |
| gpgcheck | 是否启动gpgcheck功能 no |
| file | 指定yum源的文件自动添加.repo 默认与模块名字一致 |

在nfs01上用yum安装nginx
bash 复制代码
##nginx官网的yum源文件书写
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
###用ansible的yum_repostiory模块安装
ansible nfs -m yum_repository -a 'name=nginx-stable description=nginx baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ enabled=yes gpgcheck=yes'

5.6 用户管理

5.6.1 user模块

|-------------|---------------------|
| user模块 | |
| name | 指定用户名 |
| uid | 指定uid |
| group | 指定用户组 |
| shell | 指定命令解释器 |
| create_home | 是否创建家目录(yes/no) |
| state | present 添加 absent删除 |

创建www-ans用户uid 2001虚拟用户
bash 复制代码
ansible all -m user -a 'name=ans-www uid=2001 shell=/sbin/nologin create_home=yes  state=present'
批量更新密码
bash 复制代码
##下面命令可以更新密码,密码为1
ansible all -m user -a "name=xzb66 password={{'1'|password_hash('sha512','xzb666')}} state=present"

5.7 mount模块

实现mount命令进行挂载可以修改/etc/fstab实现永久挂载

|---------|--------------------------------------------|
| mount选项 | 说明 |
| fstype | filesystem type指定文件系统,xfs,ext4,iso9660,nfs |
| src | 源地址(nfs服务端地址) |
| path | 注意这里不是dest,挂载点(要把源挂载到哪里) |
| state | 参考下表 |

|----------------------|-------------------|
| mount模块的state参数可使用的值 | |
| absent | 卸载并修改fstab |
| unmounted | 卸载不修改/etc/fstab |
| present | 仅修改/etc/fstab 不挂载 |
| mounted | 挂载并修改/etc/fstab |
| remounted | 重新挂载 |

通过ans管理在web01上挂载nfs:/data挂载到web01的/ans-upload/
bash 复制代码
##1.在web01服务器上安装nfs
ansible web01 -m yum -a 'name=nfs-utils state=present'
##2.创建挂载点
ansible web01 -m file -a 'name=/ans-upload state=directory'
##3.挂载nfs
ansible web01 -m mount -a 'src=172.16.1.31:/data/ path=/ans-upload fstype=nfs
state=mounted'
#4.检查
ansible web  -a 'df -h' 
ansible web  -a 'grep upload /etc/fstab'

5.8 cron模块

用于管理系统的定时任务,替代了crontab -e功能

|--------|-----------------------------------------------------------------|
| cron模块 | 说明 |
| name | 定时任务名字(一定要加上), 注释的内容 |
| minute | 分钟 minute="*/2" |
| hour | 小时 |
| day | 日期 |
| month | 月份 |
| week | 周几 |
| job | 指定命令或脚本(定向到空) job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" |
| state | present 添加定时任务(默认) absent 删除 |

每3分钟同步时间
bash 复制代码
##清理已有的定时任务:
ansible all -a "sed -i '/ntpdate/d' /var/spool/cron/root"
##创建定时任务
ansible all  -m cron -a 'name="sync time by xzb666" minute="*/3"  job="/sbin/ntpdatentp1.aliyun.com  &>/dev/null"  state=present'
##查看定时任务
ansible all -a 'crontab -l'
##删除定时任务
ansible all -m cron -a 'name="time by xzb666" state=absent'
相关推荐
眠修6 分钟前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟1 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194051 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany1 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿2 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing2 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛3 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
小Mie不吃饭3 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
fo安方4 小时前
运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证
运维·中间件·zabbix