网站集群批量管理-密钥认证与Ansible模块

一、集群批量管理-密钥认证

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目录下名叫* 的文件)

bash 复制代码
ansible 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"
相关推荐
Hy行者勇哥5 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏7 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风17 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠1 个月前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible
小义_1 个月前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible