一、集群批量管理-密钥认证
1、概述
管理更加轻松:两个节点,通过密钥形式进行访问,不需要输入密码,仅支持单向.
服务要求(应用场景):
- 一些服务在使用前要求我们做秘钥认证.
- 手动写批量管理脚本.
名字: 密钥认证,免密码登录,双机互信.
2、原理
税钥对:
公钥:public key 一般以 .pub 结尾.
私钥:private key 没有特殊的结尾
3、上手指南
基本检查
bash
#检查网络是否能通
ping ip地址
#检查端口连通性。telnet ip 22也可以,nmap多用于多ip和扫描所有端口
nmap -p22 ip地址
3.1、创建密钥对
只能创建一次,否则再次创建会导致密钥失效。说明其他服务通过秘钥链接的全部失效
bash
ssh-keygen -t rsa
#注意创建的啥时候也可以不加-t
通过rsa方法对数据进行加密,
[root@localhost .ssh]# tree
.
├── id_rsa
└── id_rsa.pub
3.2、分发公钥
bash
#传给你需要免密测试的那台机器(-i /root/.ssh/id_rsa.pub可省略)
ssh-copy-id root@IP地址
ssh-copy-id -i /root/.ssh/id_rsa.pub root@IP
#传到对端服务器改名为
[root@localhost .ssh]# tree
.
├── authorized_keys
3.3、连接测试
bash
ssh root@IP地址
4、自动化创建与分发密钥
阻碍:
- 创建密钥对
- 分发公钥的时候:yes/no(yes后会把信息保存到.ssh/known_hosts)
- 分发公钥的时候:输入密码
4.1、自动化创建密钥
bash
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
-f 用于指定私钥的位置
-P 密码短语 设置为空
4.2、自动化分发公钥
bash
sshpass -p*** ssh-copy-id -oStrictHostKeyChecking=no IP地址
#安装密码提供密码
yum install -y sshpass
#sshpass命令基本使用
-p 指定密码:
sshpass -p*** ssh 10.0.0.7 hostname -I
#使用sshpass 与ssh-copy-id分发公钥
sshpass -p*** ssh-copy-id -oStrictHostKeyChecking=no IP
补充说明:
sshpass适用于给ssh相关的命令提供密码:ssh,scp,ssh-copy-id.
阻碍:第1次连接的时候提示yes/no
温馨提示:第1次远程的提示 yes/no,主机密钥信息检查,输入yes后存放到~/.ssh/known_hosts 解决思路:临时取消即可,连接的时候不检查主机信息、-oStrictHostKeychecking=no 临时不检查主机信息。
SSH使用密钥对来进行身份验证和加密通信。当你连接一个未知的主机时,SSH会生成一个主机密钥对,并将公钥发送给你的客户端。你的客户端会提示你是否要保存这个公钥。如果你选择保存,该公钥将被存储在你的本地计算机上的一个文件中,通常是 known_hosts 文件中。之后,当你再次连接该主机时,SSH会使用这个已保存的公钥来验证主机的身份,以确保连接的安全性。
4.3、自动化创建密钥与分发脚本
1.0
bash
#!/bin/bash
# author: linux皆文件
# version: v1.0
# desc: creating key, distributing key
# 1 vars
password=1
ips="10.0.0.7 10.0.0.31"
# 1.4 Networking or not
# 1.5 Whether yum is supported
# 2 Creating a key_pair
if [ -f ~/.ssh/id_rsa ] ;then
echo "The key_pair already exists"
else
echo "Creating a key_pair..."
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &>/dev/null
fi
# 3 Batch send public_key through a loop
for ip in $ips
do
sshpass -p${password} ssh-copy-id -i ~/.ssh/id_rsa.pub -oStricHostKeyChecking=no $ip &>/dev/null
echo "$ip success..."
1.1
bash
#!/bin/bash
# author: linux皆文件
# version: v1.1
# desc: creating key, distributing key
# 1 vars
password=a
ips="10.0.0.7 10.0.0.31"
. /etc/init.d/functions
# 1.4 Networking or not
# 1.5 Whether yum is supported
# 2 Creating a key_pair
if [ -f ~/.ssh/id_rsa ] ;then
echo "The key_pair already exists"
else
echo "Creating a key_pair..."
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &>/dev/null
if [ $? -eq 0 ] ;then
action "Key_pair created successfully" /bin/true
else
action "Key_pair creation failure" /bin/false
fi
fi
# 3 Batch send public_key through a loop
for ip in $ips
do
sshpass -p${password} ssh-copy-id -i ~/.ssh/id_rsa.pub -oStrictHostKeyChecking=no $ip &>/dev/null
if [ $? -eq 0 ] ;then
action "$ip success..." /bin/true
else
action "$ip failure..." /bin/false
fi
done
密钥自动化检查脚本
bash
[root@m01 ~]# cat /server/scripts/check.sh
#!/bin/bash
# author: linux皆文件
# desc: 批量在所有机器上执行命令
for ip in 10.0.0.7 10.0.0.31
do
ssh $ip hostname
done
二、集群自动化维护-必备工具-Ansible
官方文档:链接指南
linux下帮助指令:ansible-doc -s 摸块名称
1、概述
自动化运维: 批量管理,批量分发,批量执行,维护
Ansible是python写的.
批量管理工具 | 说明 |
---|---|
Ansible | 无客户端,基于ssh进行管理和维护 |
Saltstack | 需要安装客户端,基于shh进行管理 |
terraform | tf批量管理基础设施(批量创建100台公有云)例如:腾讯云 |
2、Ansible管理架构
- Inventory 主机清单:被管理主机的ip列表,分类
- ad-hoc模式:命令行批量管理(使用ans模块),临时任务
- playbook 剧本模式:类似于把操作写出脚本,可以重复运行这个脚本
3、配置与部署
3.1、部署
bash
yum install -y ansible
3.2、配置
修改配置文件
- 关闭主机认证Host_key_checking
- 开启日志功能.
bash
root@m01 ~]# egrep -nv '^$|^#' /etc/ansible/ansible.cfg
10:[defaults]
71:host_key_checking = False
111:log_path = /var/log/ansible.log
327:[inventory]
340:[privilege_escalation]
346:[paramiko_connection]
370:[ssh_connection]
431:[persistent_connection]
445:[accelerate]
460:[selinux]
469:[colors]
485:[diff]
4、Ans-inventory主机清单
- 什么是主机清单: 让ansible管理的节点的列表.
- ansible默认读取在/etc/ansible/hosts文件,并非/etc/hosts.
- 未来实际使用中一般我们会把主机清单文件存放在指定的目录中,运行ansible的时候通过
- i
选项指定主机清单文件即可.
4.1、主机清单必会格式
主机清单格式: [分类或分组的名字] #注意分类要体现出服务器的作用 ip地址或主机名或域名 #注意主机名要能解析才行
bash
[root@m01 ~]# cat /etc/ansible/hosts
[backup]
10.0.0.41
[web0]
10.0.0.7
主机清单分组详解:
需要我们进行分组:按照层次进行分组,按照功能/业务.
ansible命令格式
ansible主机ip / 分组 / all
-m 指定使用的模块名字,这里的ping模块用于检查被管理端是否可以访问。
4.2、子组
创建新的分组data包含已有的分组web和nfs
bash
[root@m01 ~]# cat /etc/ansible/hosts
[backup]
10.0.0.41
[web]
10.0.0.7
[data:children]
web
backup
[root@m01~]# ansible data -m ping
4.3、指定用户和密码
不推荐,推荐先配置密钥认证,然后管理
[root@m01~]# cat /etc/ansible/hosts
[web]
10.0.0.7
[nfs]
10.0.0.31 ansible_user=root ansible_password=*** ansible_port=22
4.4、报出错误提示
- 主机清单为空
- 没有关闭主机认证,去配置文件中host_key_checking = False
5、Ansible必知必会模块
-
Ansible模块概述
- ansible中的模块就类似于Linux中的命令,我们Linux命令管理系统,我们通过ansible模块实现批量管理.
- ansible中模块一般相当于Linux中的一些命令.yum模块,file模块,user模块.
- ansible中的模块拥有不同的选项,这些选项一般都是一些单词.。Ansible模块 modules
-
Ansible中通过各种模块实现批量管理
-
一般来说这些模块对应着Linux里面的基本操作或服务管理
-
找出Linux场景操作对应的模块即可
模块分类 | 模块 |
---|---|
命令和脚本模块 | command模块 ans默认的模块,执行简单命令,不支持特殊符号 |
shell模块 执行命令,支持特殊符号 | |
script模块 分发脚本并执行 | |
文件 | file创建目录,文件,软连接, |
copy远程分发文件,修改权限,所有者,备份 | |
服务 | systemd服务管理 |
service服务管理(了解) | |
软件包 | yum源 yum_repository |
yum命令 | |
get_ur1下载软件 | |
系统管理 | mount模块 挂载 |
cron模块定时任务 | |
用户管理 | group模块 管理用户组 |
user模块 管理用户 | |
其他可以研究 | 压缩解压(unarchive),rsync模块(synchronize),数据库模块(mysql_db,mysq1_user)... |
其他 | ansible管理docker k8s zabbix grafana ... |
用于调试模块 | ping模块检查ansible与其他节点连通性. |
debug模块用于检查/显示变量 |
ansible | |||
---|---|---|---|
ansible | 主机清单(all/web/172.16.1.7) | -m模块 | -a模块中的选项 |
-i 指定主机清单文件 | |||
-m 指定模块 | |||
-a 指定模块中的选项 |
5.1、命令与脚本模块
a)command 模块
可以省略。
是ans默认的模块,适用于执行简单的命令,不支持特殊符号.
批量获取所有主机的主机名
bash
ansible all -m command -a 'hostname'
b)shell模块
与command模块类似,但是shell支持特殊符号.
批量获取ip地址
bash
ansible all -m shell -a "ip a s eth0 |awk -F'[ /]+' 'NR==3{print \$3}' "
温馨提示:
shell模块不推荐执行较为复杂的指令,如果需要执行放在脚本中执行
c)script模块
分发脚本(传输脚本)
运行脚本
bash
ansible all -m script -a '/sh/xunjian.sh'
5.2、文件相关模块
a)file模块
管理文件,管理目录,软连接
file模块 | 模块说明 |
---|---|
path | 路径(目录,文本)必须写 |
src | 源文件,一般用于link(创建软连接模式)用于指定源文件 |
state | 状态(模式) state=directory 创建目录 state=file (默认) 更新文件,如果文件不存在也不创建 state=link 创建软连接 state=touch 创建文件 |
state | state=absent 删除(注意递归删除目录) |
mode | mode=755 创建并修改权限 |
owner | owner=root |
group | group=root |
创建文件
bash
ansible all -m file -a 'path=/data/test.txt state=touch'
创建目录
bash
ansible all -m file -a 'path=/app/a/b/c/d state=directory'
修改权限
bash
ansible all -m file -a 'path=/data mode=700'
删除目录及其下面文件
bash
ansible all -m file -a 'path=/app/ state=absent'
不能表示删除目录下的文件(表示只删除app目录下名叫
*
的文件)
bashansible all -m file -a 'path=/app/* state=absent'
创建软连接 /etc/hosts创建软连接到/opt/下
bash
ansible all -m file -a 'src=/etc/hosts path=/opt/hosts state=link'
b)copy模块
批量分发:scp
copy模块 | |
---|---|
src | source 源文件 |
dest | destination 目标 |
backup | backup=yes 则会在覆盖前进行备份 |
mode | 修改权限 |
owner | 修改为指定所有者 |
group | 修改为指定用户组 |
把本机解析hosts覆盖全部
bash
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'
5.3、服务管理-sysytemd
systemd模块相当于是linux systemctl命令:
- 开启/关闭/重启服务
- 开机自启动
systemd模块 | 说明 |
---|---|
name | 用于指定服务名称 |
enabled | yes开机器启动(yes/no) |
state | 表示服务开,关,重启. state=started 开启 state=stopped 关闭 state=reloaded 重读配置文件 starte=restsrted 重启(关闭再开启) |
daemon-reload | yes是否重新加载对应的服务的管理配置文件(未来讲解书写systemctl配置文件) |
bash
ansible all -m systemd -a 'name=crond enabled=yes state=started'
#关闭服务
ansible all -m systemd -a 'name=firewalld enabled=no state=stopped'
#重启ssh
ansible all -m systemd -a 'name=sshd state=reloaded'
额外扩展: systemd模块适用于目前大部分的Linux系统. service模块适用于管理旧的Linux系统.
5.4、软件管理
yum模块
get_url模块,wget命令
yum_repository模块yum源配置模块,未来可以通过copy模块
a)yum模块
yum模块 | |
---|---|
name | 指定软件包名字,可以指定多个,通过 ,分割 |
state | installed 安装(也可以写为present)(默认) removed 删除(也可以号为absent) lastest 安装或更新 |
update_cache | 可以设置为no加加速,表示不更新本地yur缓存,实际应用建议开启 |
bash
ansible all -m yum -a 'name=htop,tree,lrzsz,sshpass'
b)get_url 模块
相当于是wget命令.所有主机能访问网络才行.
推荐在管理节点下载好,使用copy仅分发即可.
get_url下载功能 | |
---|---|
url | 指定要下载的地址 |
dest | 下载到哪个目录 |
bash
ansible all -m file -a 'path=/app/tools/ state=directory'
ansible all -m get_url -a 'url="https://mirrors.aliyun.com/zabbix/zabbix/6.0/rh el/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm" dest=/app/tools/'
c)yum_repository模块
未来书写好yum配置文件,copy分发过去即可.
bash
ansible all -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/ backup=yes'
yum源模块 yum_repository | |
---|---|
name | yum源中名字 [epel] |
description | yum源的注释说明 对应的 是name的内容 |
baseurl | yum源中 baseurl 下载地址 |
enabled | 是否启动这个源 yes/no |
gpgcheck | 否启动gpgcheck功能 no |
file | 指定yum源的文件 自动添加.repo 默认与模块名字一致, |
5.5、用户管理
user用户管理:useradd,userdel
group用户组管理:groupadd
user模块
user模块 | |
---|---|
name | 用户名 |
uid | 指定uid |
group | 指定用户组,一般用于事先创建好了用户组,通过选项指定下 |
shell | 指定命令解释器:默认是/bin/bash /sbin/nologin |
create_home | 是否创建家目录(yes/no) |
state | present 添加 absent 删除 |
创建www-ans用户uid 2000虚拟用户
bash
ansible all -m user -a 'name=www-ans uid=2000 shell=/sbin/nologin create_home=no state=present'
批量更新密码
bash
ansible all -m user -a "name=test password={{ '1' | password_hash('sha512', 'lidao') }} state=present"
ansible all -m shell -a 'echo 1 |passwd --stdin test'
关于{{}}相关的解释 {{ '1' | password_hash('sha512', 'lidao') }} 表示1是密码,经过管道,传递给了password_hash()插件, sha512加密算法,lidao是随机字符用于生成随机加密后的密码.
group模块
group模块 | |
---|---|
nane | 指定用户组名字 |
gid | 指定组的gid |
state | present添加 absent 删除 |
6、mount模块
实现mount命令进行挂载可以修改/etc/fstab实现永久挂载.
mount选项 | 说明 |
---|---|
fstype | filesystem type指定文件系统,xfs,ext4,nfs |
src | 源地址(43.135.140.22:/backup-nfs/) |
path | 挂载点(要把源挂载到哪里) |
state | 参考下表 |
mount模块的state参数可使用的值 | |
---|---|
absent | 卸载升修改fstab |
unmounted | 卸载不修改/etc/fstab |
present | 仅修改/etc/fstab 不挂载 |
mounted | 挂载并修改/etc/fstab |
remounted | 重新挂载 |
通过ans管理在web01上挂载nfs:/data挂载到web01的/ans-upload/
bash
nfs 服务端配置,目录
web 挂载
web 是否安装nfs
web 创建挂载点
#在web服务器上安装nfs
ansible web -m yum -a 'name=nfs-utils state=present'
#创建挂载点
ansible web -m file -a 'path=/ans-upload/ state=directory'
#挂载nfs
ansible web -m mount -a 'src=172.16.1.31:/data/ path=/ans-upload/ fstype=nfs state=mounted'
#检查
ansible web -a 'df -h'
ansible web -a 'grep upload /etc/fstab '
7、cron模块
用于管理系统的定时任务,替代了crontab -e功能.
cron模块 选项 | 说明 |
---|---|
name | 定时任务名字(一定要加上),对应下面注释的内容 |
minute | 分钟 minute="*/2" |
hour | 小时 |
day | 日期 |
month | 月份 |
week | 周几 |
job | 指定命令或脚本(定向到空)job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" |
state | present 添加定时任务(默认) absent 删除 |
创建定时任务
bash
ansible all -m cron -a 'name="sync time by linux" minute="*/3" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null"