综合架构第二篇
1. 批量管理基础内容-SSH服务-远程连接服务
1.1 SSH服务概述
- SSH服务-OpenSSH,远程连接
- 服务端
- 客户端
openssh-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
openssh-clients-7.4p1-21.el7.x86_64
1.2 OpenSSH vs Telnet
对比OpenSSH和Telent服务 | 共同点 | 区别 | 应用场景 |
---|---|---|---|
OpenSSH | 远程连接 | 连接时候数据加密 | 默认使用 |
Telent | 远程连接 | 连接时候数据未加密(明文) | 未来升级OpenSSH,建议先安装telnet服务,然后升级 |
1.3 OpenSSH服务端配置
1)概述
openssh服务端软件包内容 | ||
---|---|---|
/etc/ssh/sshd_config #daemon守护进程/服务 | #openssh服务端配置文件 | |
/usr/lib/systemd/system/sshd.service | openssh服务端管理配置文件 (systemctl start/stop/restart sshd) |
|
/usr/sbin/sshd | openssh服务启动命令 |
[root@nfs01 ~]# ps -ef |grep '/sbin/sshd'
root 39504 1 0 10:00 ? 00:00:00
/usr/sbin/sshd -D
root 39759 2254 0 10:16 pts/0 00:00:00
grep
2) 服务端配置文件详解
配置文件 | ||
---|---|---|
性能优化 | UseDNS no | 是否开启DNS反向解析(ip---->域名),这个选项默认开启,会导致远程连接慢。 |
GSSAPIAuthentication no | 是否开启GSSAPI认证,默认开启,开启后导致远程连接慢。 | |
安全配置 | Port 22 | 配置SSH服务端端口号,未来出于安全考虑要修改,默认是22端口 |
PermitRootLogin yes | 是否准许root远程登录,默认是yes(ubuntu系统默认是no) | |
ListenAddress | 配置用户只能通过哪个ip连接进来(网卡), 指定的本地网卡的ip地址. 默认是: 0.0.0.0 所有用户都可以连接. |
|
PasswordAuthentication yes | 是否准许通过密码登录(是否开启密码登录.) | |
UsePAM yes | 是否开启PAM认证(安全部分讲解). |
开启禁用root远程登录.
查看日志/var/log/secure
pam_succeed_if(sshd:auth): requirement "uid ≥ 1000" not met by user "root"
需要登录的用户的uid大于等于 1000,但是现在登录的用户是root(uid 0)
1.4 OpenSSH客户端命令
1)概述
Openssh客户端核心命令 | 作用 |
---|---|
scp | 远程传输命令 |
ssh | 命令行远程连接工具 |
sftp | ftp工具 |
2)scp
scp -r -P 22 /etc/ 10.0.0.31:/tmp
-r递归传输目录
-P指定端口号,不指定默认是22
3)ssh
- 远程连接10.0.0.41的22端口
scp -r -P 22 /etc/ 10.0.0.31:/tmp
- 远程连接到10.0.0.41的22端口执行命令hostname并返回
[root@nfs01 ~]# ssh -p 22 root@10.0.0.41 hostname
root@10.0.0.41's password:
backup
4)sftp
- ftp:文件传输协议,服务端口号21..... 一般用于传输数据:windows+linux 类似与rz和sz
- 对与大文件推荐使用:scp/rsync/ftp传输
现在在10.0.0.31机器,连接10.0.0.41通过sftp
上传 put
sftp> put /etc/hostname #把31的hostname上传到41
下载 get
sftp> get /etc/hostname #把41的hostname下载到31
查看远程目录信息
ls
ls -l
查看本地目录信息
lls
lls -l
- 图像化界面版本
- winscp
- xxxftp
- xshell
- xftp
1.5 Openssh密钥认证
-
密钥认证:也叫免密码登录,也叫双击互信。
-
目标:
- 让linux系统之间(1台到其他所有)远程连接的时候不需要输入密码
- 实现初步批量管理功能
- 未来一些服务软件需要我们先部署密钥认证
1)实战应用
环境准备 | |
---|---|
m01 | 批量管理服务,要可以连接其他所有机器,存放密钥对 |
backup | 被管理机器 |
nfs01 | 被管理机器 |
web01 | 被管理机器 |
1.创建密钥对
[root@m01 ~]# ssh-keygen
Generating public/private rsa key pair. #正在创建密钥对
Enter file in which to save the key (/root/.ssh/id_rsa): #指定存放密钥对的位置
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 回车 #指定私钥秘钥
Enter same passphrase again: 回车 #重复输入密码
Your identification has been saved in /root/.ssh/id_rsa. #私钥创建在的位置和名字
Your public key has been saved in /root/.ssh/id_rsa.pub. #公钥创建在的位置和名字
The key fingerprint is:
SHA256:PnhY41vXVQBwfWGRvRT5RQEPc4dLyB1QfCIJpaD7mzo root@m01
The key's randomart image is:
+---[RSA 2048]----+
| . o==&=@@|
| . . o= &=*|
| . . o.*=|
| . ..o|
| . S .|
| B . . . |
| o * . . . |
| E. * . |
| .o+ |
+----[SHA256]-----+
[root@m01 ~]# ll ~/.ssh/
total 8
-rw------- 1 root root 1675 Jul 23 21:14 id_rsa
-rw-r--r-- 1 root root 390 Jul 23 21:14 id_rsa.pub
2.分发密钥(公钥)
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.31 (10.0.0.31)' can't be established.
ECDSA key fingerprint is SHA256:4lgtLl9hwzEp5nGZJYVv40T67PhyXo0CBgNu7B8/NNc.
ECDSA key fingerprint is MD5:c6:f5:fa:9f:a6:67:24:fc:bc:d1:3b:ea:06:03:4d:28.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.31's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@10.0.0.31'"
and check to make sure that only the key(s) you wanted were added.
3.测试
[root@m01 ~]# ssh root@10.0.0.31 hostname
nfs01
1.6 Openssh密钥认证一键化部署
1.一键创建密钥对
ssh-keygen -f ~/.ssh/* -P ''
2.分发密钥(公钥)
分发密钥的时候关闭主机验证功能,临时
ssh-copy-id -i ~/.ssh/id_rsa.pub -o StricHostKeyChecking=no root@10.0.0.31
sshpass -p1 ssh-copy-id -i ~/.ssh/id_rsa.pub -o StricHostKeyChecking=no root@10.0.0.31
- sshpass使用
替我们在需要的时候提供ssh的命令:sshpass
yum install -y sshpass
[root@m01 ~]# ssh 10.0.0.31 hostname
root@10.0.0.31's password:
[root@m01 ~]# sshpass -p1 ssh 10.0.0.31 hostname
nfs01
[root@m01 ~]# sshpass -p1 ssh root@10.0.0.31 hostname
nfs01
- 一键化脚本实现:创建密钥对和分发密钥对
脚本内容
第一步:创建密钥对
第二步:分发公钥
[root@m01 ~]# cat /server/scripts/fenfa.sh
#!/bin/bash
#author:lichengbo
#desc 一键自动化创建密钥对
ssh_root_pass="1"
ip_list='10.0.0.31 10.0.0.7 10.0.0.41'
echo '------------------------------------------------------'
echo '1.创建kye'
echo '------------------------------------------------------'
ssh-keygen -f ~/.ssh/id_rsa -P ''
echo '------------------------------------------------------'
echo '2.分发 pub key'
echo '------------------------------------------------------'
for ip in $ip_list
do
sshpass -p$ssh_root_pass ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$ip
done
# shell编程中循环:for循环
for ip in {1..10}
do
echo $ip
done
- 一键化脚本实现:批量执行命令(检查)
[root@m01 ~]# cat /server/scripts/jiancha.sh
#!/bin/bash
#author:lichengbo
#desc 批量检查脚本
ip_list='10.0.0.31 10.0.0.7 10.0.0.41'
echo '------------------------------------------------------'
echo '批量执行命令'
echo '------------------------------------------------------'
for ip in $ip_list
do
ssh root@$ip $@
done
[root@m01 ~]# sh /server/scripts/jiancha.sh hostname
------------------------------------------------------
批量执行命令
------------------------------------------------------
nfs01
web01
backup
1.7 堡垒机/跳板机
- 服务端(m01)
- 助手(windows)
1)服务端
#官网下载服务端软件包:https://tp4a.com
tar xf teleport-linux-3.0.2.9.tar.gz
cd teleport-linux-3.0.2.9
./setup.sh
- 浏览器访问 http://10.0.0.61:7190
2)客户端
- 直接在windows上安装
2. 自动化管理-Ansible
2.1 什么是自动化批量管理
- 重复性工作与内容:思考如何自动化完成。
- 部署环境,批量查看信息,批量检查:自动化
- 一般步骤:
- 1️⃣如何手动实现
- 2️⃣如何自动化管理工具,批量实现
- 3️⃣注意事项:想要自动化一定要先标准化(所有的环境,软件,目录,一致)
- 4️⃣注意事项:尽量进行分组(比如:所有web服务器是一组)
2.2 自动化工具选择
自动化批量管理工具 | |
---|---|
Ansible | 基于python语言写,使用极其简单,不需要客户端 |
Saltstack | 基于python语言写,需要安装客户端 |
TereForm | 批量管理平台 |
Chef | 了解即可 |
puppet | 古老的一些批量管理工具 |
2.3 Ansible架构
2.4 Ansible极速使用指南
1)环境准备
Ansible环境 | 主机名和ip |
---|---|
ansible管理端 | m01 10.0.0.61 |
被管理机器 | web01 10.0.0.7 |
被管理机器 | backup 10.0.0.41 |
被管理机器 | nfs01 10.0.0.31 |
被管理机器 | db01 10.0.0.51 |
- ⚠️ansible管理端与其他机器配置好密钥认证
[root@m01 ~]# cat /server/scripts/fenfa.sh
#!/bin/bash
#author:lichengbo
#desc 一键自动化创建密钥对
ip_list='10.0.0.31 10.0.0.7 10.0.0.41 10.0.0.51'
echo '------------------------------------------------------'
echo '1.创建kye'
echo '------------------------------------------------------'
ssh-keygen -f ~/.ssh/id_rsa -P ''
echo '------------------------------------------------------'
echo '2.分发 pub key'
echo '------------------------------------------------------'
for ip in $ip_list
do
sshpass -p1 ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$ip
done
~
[root@m01 ~]# cat /server/scripts/jiancha.sh
#!/bin/bash
#author:lichengbo
#desc 批量检查脚本
ip_list='10.0.0.31 10.0.0.7 10.0.0.41 10.0.0.51'
echo '------------------------------------------------------'
echo '批量执行命令'
echo '------------------------------------------------------'
for ip in $ip_list
do
ssh root@$ip $@
done
- 密钥认证结果
[root@m01 ~]# sh /server/scripts/jiancha.sh hostname
------------------------------------------------------
批量执行命令
------------------------------------------------------
nfs01
web01
backup
db01
2) ansible部署
- m01上安装
yum install -y ansible
3) 初步配置主机清单(inbentory)
[root@m01 ~]# cat /etc/ansible/hosts
[oldboy]
172.16.1.7
172.16.1.31
172.16.1.41
172.16.1.51
4) 与ansible的第一次接触
ansible oldboy -m ping
#epel源中的软件包
- 第一次测试需要输入yes/no
5)小结
- 1️⃣做密钥认证
- 2️⃣环境准备,部署ansible
- 3️⃣修改ans 主机清单
- 4️⃣测试
ansible oldboy -m ping
ansible命令格式 | |||
---|---|---|---|
ansible | 主机分组 | -m指定模块 | |
ansible | 主机分组 | -m指定模块 | -a 指定模块中的选项 |
module模块 | action动作 |
ansible oldboy -m command -a 'hostname'
ansible oldboy -m command -a 'crontab -l'
2.5 Ans配置文件
/etc/ansible/ansible.cfg #ans配置文件
/etc/ansible/hosts #ans主机清单,默认是
2.6 主机清单
1) 基本格式
[root@m01 ~]# cat /etc/ansible/hosts
[oldboy] #[组的名字]
172.16.1.7
172.16.1.31
172.16.1.41
172.16.1.51
[web]
172.16.1.7
[backup]
172.16.1.31
[nfs]
172.16.1.41
[db]
172.16.1.51
2)指定用户名,密码,端口
主机清单指定信息 | ||
---|---|---|
连接的ssh端口 | ansible_ssh_port=22 | |
连接的ssh用户 | ansible_ssh_user=root | |
连接的ssh密码 | ansible_ssh_psaa=1 |
[web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_psaa=1
[backup]
172.16.1.31
[nfs]
172.16.1.41
[db]
172.16.1.51
3)子组
- 把多个主机分组进行合并,比如把db,nfs,backup合并成一个组叫data组
[web]
172.16.1.7
[backup]
172.16.1.31
[nfs]
172.16.1.41
[db]
172.16.1.51
[data:children] #data:children表示data是创建的子组 组里包含db,nfs,backup 3个组
db
nfs
backup
4)主机清单案例
[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7
[nfs]
172.16.1.31
[backup]
172.16.1.41
[db]
172.16.1.51
[data:children]
db
nfs
backup
案例01: 查看与使用指定的子组 data
[root@m01 ~]# ansible data -m command -a 'hostname'
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.51 | CHANGED | rc=0 >>
db01
172.16.1.41 | CHANGED | rc=0 >>
backup
案例02: 查看与使用指定的组db
[root@m01 ~]# ansible db -m command -a 'hostname'
172.16.1.51 | CHANGED | rc=0 >>
db01
案例03:查看所有主机的情况
[root@m01 ~]# ansible all -m command -a 'hostname'
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.51 | CHANGED | rc=0 >>
db01
172.16.1.7 | CHANGED | rc=0 >>
web01
案例04:查看某一台机器
[root@m01 ~]# ansible 172.16.1.7 -m command -a 'hostname'
172.16.1.7 | CHANGED | rc=0 >>
web01
5)主机清单inbentory小结
- 如何添加被ans的主机
- 如何对主机进行分组,子组
- 如何使用ansible调用这些分组和主机
3. Ans核心模块
- AD-Hoc 命令行调用ans模块
3.1 模块概述
模块分类 | |
---|---|
命令和脚本模块 | command模块 默认的模块 执行简单命令,不支持特殊符号 |
shell模块 执行命令,支持特殊符号 | |
script模块 分发脚本并执行 | |
文件 | file 创建目录,文件,软连接, |
copy 远程分发文件,修改权限,所有者,备份 | |
服务 | systemd服务管理 |
service 服务管理(了解) | |
软件包 | yum源 yum_repository |
yum命令 | |
get_url下载软件 | |
系统管理 | mount模块 挂载 |
cron模块 定时任务 | |
用户管理 | group模块 管理用户组 |
user模块 管理用户 | |
其他可以研究 | 压缩解压(unarchive) ,rsync模块(synchronize),数据库模块 (mysql_db,mysql_user)... |
其他 | ansible管理docker k8s zabbix grafana.... |
用于调试模块 | ping 模块检查 ansible与其他节点连通性 |
debug 模块 用于检查/显示 变量 |
3.2 如何查询帮助
- 通过命令查看:
ansible-doc -s command
- 通过官网查看:传送门
3.3 Ans-命令与脚本类模块
1)command
- 仅支持简单命令,不支持特殊符号,比如管道......
- ⚠️这个模块是默认模块,ansible不加上模块默认就使用这个模块。
ansible all -m command -a '命令'
ansible all -a 'hostname' #相当于省略 -m command
2)shell模块
- 与command模块类似,shell模块支持特殊符号,执行脚本.....
- ansible中的颜色
- 绿色表示正常
- 黄色表示执行正常,状态变化
- 红色表示错误,输出错误信息
- 紫色表示警告,建议
3) script模块-传输脚本到被管理端并执行脚本
- 传输脚本
- 执行脚本
安装ipvsadm
[root@m01 ~]# cat /server/scripts/yum.sh
yum install -y ipvsadm
使用script 模块执行脚本
ansible db -m script -a '/server/scripts/yum.sh'
- 卡住需要清理下:被管理机器的yum缓存
4)命令与脚本模块
模块 | 含义 | 应用 |
---|---|---|
command模块 | 执行命令 | 简单命令,不含特殊符号,默认的模块 ansible all -a 'hostname' |
shell模块 | 执行命令或脚本 | 执行含有特殊符号:管道,反引号,{}的命令,运行脚本。(脚本在被管理端) |
script模块 | 先传输脚本,然后运行搅拌 | 一般用于执行脚本 |
3.4 Ans-文件与目录管理模块
- file 创建文件,目录
- copy 远程传输文件,目录。类似于scp
1)file模块
- 管理文件或目录,软链接
file模块中的选项 | |
---|---|
path | 路径(目录,文件) 必须要写 |
src | 源文件一般用于link(创建软连接模式) 用于指定源文件 |
state | 状态(模式) state=directory 创建目录 state=file (默认) 更新文件,如果文件不存在也不创建. state=link 创建软连接 state=touch 创建文件 state=absent 删除 |
案例01:创建目录/oldboy/目录
[root@m01 ~]# ansible all -m file -a 'path=/oldboy state=directory'
[root@m01 ~]# ansible all -a 'ls -ld /oldboy/'
172.16.1.41 | CHANGED | rc=0 >>
drwxr-xr-x 2 root root 6 Jul 24 22:50 /oldboy/
172.16.1.31 | CHANGED | rc=0 >>
drwxr-xr-x 2 root root 6 Jul 24 22:50 /oldboy/
172.16.1.51 | CHANGED | rc=0 >>
drwxr-xr-x 2 root root 6 Jul 24 22:50 /oldboy/
172.16.1.7 | CHANGED | rc=0 >>
drwxr-xr-x 2 root root 6 Jul 24 22:50 /oldboy/
案例02:创建文件/oldboy/oldboy.txt文件
[root@m01 ~]# ansible all -m file -a 'path=/oldboy/oldboy.txt state=touch'
[root@m01 ~]# ansible all -a 'ls -l /oldboy/oldboy.txt'
172.16.1.31 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Jul 24 22:52 /oldboy/oldboy.txt
172.16.1.41 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Jul 24 22:52 /oldboy/oldboy.txt
172.16.1.7 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Jul 24 22:52 /oldboy/oldboy.txt
172.16.1.51 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Jul 24 22:52 /oldboy/oldboy.txt
案例03:创建软链接/oldboy/oldboy.txt到/tmp/oldboy.txt.soft
[root@m01 ~]# #ansible all -m file -a 'src=/oldboy/oldboy.txt path=/tmp/oldboy.txt.soft state=link'
[root@m01 ~]#
[root@m01 ~]# ansible all -a 'ls -l /tmp/oldboy.txt.soft'
172.16.1.31 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 18 Jul 24 22:54 /tmp/oldboy.txt.soft -> /oldboy/oldboy.txt
172.16.1.41 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 18 Jul 24 22:54 /tmp/oldboy.txt.soft -> /oldboy/oldboy.txt
172.16.1.51 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 18 Jul 24 22:54 /tmp/oldboy.txt.soft -> /oldboy/oldboy.txt
172.16.1.7 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 18 Jul 24 22:54 /tmp/oldboy.txt.soft -> /oldboy/oldboy.txt
案例04:删除文件/目录/软链接
ansible all -m file -a 'path=/oldboy/oldboy.txt state=absent' #删除文件
ansible all -m file -a 'path=/oldboy state=absent' #删除目录
ansible all -m file -a 'path=/tmp/oldboy.txt.soft state=absent' #删除软链接
案例05:创建文件/tmp/oldboy.txt,所有者root,用户组root,权限755
[root@m01 ~]# ansible all -m file -a 'path=/tmp/oldboy.txt owner=root group=root mode=755 state=touch'
[root@m01 ~]# ansible all -a 'ls -l /tmp/oldboy.txt'
172.16.1.7 | CHANGED | rc=0 >>
-rwxr-xr-x 1 root root 0 Jul 24 23:05 /tmp/oldboy.txt
172.16.1.51 | CHANGED | rc=0 >>
-rwxr-xr-x 1 root root 0 Jul 24 23:05 /tmp/oldboy.txt
172.16.1.41 | CHANGED | rc=0 >>
-rwxr-xr-x 1 root root 0 Jul 24 23:05 /tmp/oldboy.txt
172.16.1.31 | CHANGED | rc=0 >>
-rwxr-xr-x 1 root root 0 Jul 24 23:05 /tmp/oldboy.txt
2) copy 远程传输模块
copy模块 | |
---|---|
src | source 源文件 |
dest | destination 目标 |
backup | backup=yes 则会在覆盖前进行备份 |
mode | 修改权限 |
owner | 修改为指定所有者 |
group | 修改为指定用户组 |
案例01:传输/etc/hosts文件到/etc/hosts
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts'
[root@m01 ~]# ansible all -a 'tail -2 /etc/hosts'
172.16.1.51 | CHANGED | rc=0 >>
172.16.1.61 m01
172.16.1.62 m02
172.16.1.41 | CHANGED | rc=0 >>
172.16.1.61 m01
172.16.1.62 m02
172.16.1.7 | CHANGED | rc=0 >>
172.16.1.61 m01
172.16.1.62 m02
172.16.1.31 | CHANGED | rc=0 >>
172.16.1.61 m01
172.16.1.62 m02
案例02:传输/etc/hosts文件到/etc/hosts 先备份然后修改
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'
[root@m01 ~]# ansible all -m shell -a 'ls -l /etc/hosts*'
172.16.1.7 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 328 Jul 24 23:32 /etc/hosts
-rw-r--r-- 1 root root 327 Jul 24 23:29 /etc/hosts.7671.2023-07-24@23:32:26~
-rw-r--r--. 1 root root 370 Jun 7 2013 /etc/hosts.allow
-rw-r--r--. 1 root root 460 Jun 7 2013 /etc/hosts.deny
172.16.1.51 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 328 Jul 24 23:32 /etc/hosts
-rw-r--r-- 1 root root 327 Jul 24 23:29 /etc/hosts.8805.2023-07-24@23:32:26~
-rw-r--r--. 1 root root 370 Jun 7 2013 /etc/hosts.allow
-rw-r--r--. 1 root root 460 Jun 7 2013 /etc/hosts.deny
172.16.1.31 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 328 Jul 24 23:32 /etc/hosts
-rw-r--r-- 1 root root 327 Jul 24 23:29 /etc/hosts.6286.2023-07-24@23:32:26~
-rw-r--r--. 1 root root 370 Jun 7 2013 /etc/hosts.allow
-rw-r--r--. 1 root root 460 Jun 7 2013 /etc/hosts.deny
172.16.1.41 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 328 Jul 24 23:32 /etc/hosts
-rw-r--r-- 1 root root 327 Jul 24 23:29 /etc/hosts.5875.2023-07-24@23:32:26~
-rw-r--r--. 1 root root 370 Jun 7 2013 /etc/hosts.allow
-rw-r--r--. 1 root root 460 Jun 7 2013 /etc/hosts.deny
3)文件管理与传输模块小结
文件管理与传输模块 | 含义 |
---|---|
file | 创建/删除 文件/目录,软链接 |
copy | 远程分发文件/目录,软件包,压缩包 |
3.5 Ans-服务管理模块
- systemctl 命令
- 启动、关闭、重启服务
- 开机自启动、开机不自启动
1)systemd
systemd模块 | |
---|---|
name | 用于指定服务名称 |
enabled | 控制服务的开机自启动 enabled=yes enable=no |
state | 表示服务开、关、重启... state=started 开启 state=stopped 关闭 state=reloaded 重启配置文件(服务支持) state=restarted 重启(关闭在开启) |
daemon-reload | yes是否重新加载对应的服务的管理配置文件(需要了解systemctl配置文件) |
案例01:关闭firewalld
- 正在运行
- 关闭开机自启动
[root@m01 ~]# ansible all -m systemd -a 'name=firewalld enabled=no state=stopped'
[root@m01 ~]# ansible all -a 'systemctl status firewalld'
案例02:开启sshd服务
ansible all -m systemd -a 'name=sshd enabled=yes state=started'
ansible all -a 'systemctl status sshd
案例03:重启backup这台机器上面的rsync服务
ansible backup -m systemd -a 'name=rsyncd state=restarted'
2)service 了解
服务管理模块 | systemd | service |
---|---|---|
开机自启动 | enabled | enabled |
服务名称 | name | name |
服务开关重启 | state | state |
运行级别 | 无 | runlevel (运行级别) |
重启加载systemctl配置 | daemon_reload=yes systemctl daemon-reload |
无 |
4. Ans-软件版管理模块
- yum_repository(管理yum源)
- yum (yum命令)
- get_url(wget命令)
4.1 yum源配置管理模块
yum源模块 yum_repository | yum源配置文件内容 | |
---|---|---|
name | [epel] | yum源中名字 (中括号里面的名字即可) |
description | name=xxxx | yum源的注释说明 对应的 是name的内容 |
baseurl | baseurl= | yum源中 下载软件包的地址(可以访问到repodata目录) |
enabled= yes或no | enabled=1或0 | 是否启动这个源 |
gpgcheck= yes或no | gpgcheck=0 | 是否启动gogcheck功能 no |
file(可以不加) | 无 | 指定yum源的文件 自动添加 .repo 默认与模块名字一致 |
[root@m01 ~]# cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
案例01:批量添加nginx的yum源
[nginx]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[root@m01 ~]# ansible web -m yum_repository -a 'name=nginx description="nginx stable repo" baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" gpgcheck=no enabled=yes'
注意:未来也可以通过,copy模块实现
4.2 yum模块
yum模块 | ||
---|---|---|
name | 指定软件包名字 | |
state | installed 安装(present) removed 删除 (absent) latest 安装或更新 |
案例01:安装lrzsz
ansible all -a 'rpm -e lrzsz'
ansible all -m yum -a 'name=lrzsz state=installed'
案例02:安装sl,cowsay,aalib
ansible web -m yum -a 'name=sl,cowsay,aalib state=installed'
4.3 get_url模块(wget)
get_url下载功能 | |
---|---|
url | 指定要下载的地址 |
dest | 下载到那个目录 |
案例01:下载tengine源码包到/server/tools/(不存在)目录下
下载地址:https://tengine.taobao.org/download/tengine-3.0.0.tar.gz
ansible web -m file -a 'path=/server/tools/ state=directory'
ansible web -m get_url -a 'url=https://tengine.taobao.org/download/tengine-3.0.0.tar.gz dest=/server/tools/'
ansible web -a 'tree /server/'
5. 系统管理模块
- mount 模块 ,挂载nfs模块
- cron 管理定时任务
5.1 mount模块
mount | |
---|---|
fstype | 指定文件系统 |
src | 源地址(nfs服务端地址 eg 172.16.1.31/data ) |
path | 挂载点(要把源挂载到哪里) |
state | 参考下表 |
mount模块的state参数可使用的值 | |
---|---|
absent | 卸载(umount)并修改fstab(清除配置) |
unmounted | 卸载不修改/etc/fstab |
presrnt | 仅修改/etc/fstab 不挂载 |
mounted | 挂载(用mount命令)并修改/etc/fstab (永久挂载) |
remounted | 重新挂载 |
案例01:挂载案例
web01把nfs共享的目录/data目录挂载到 web01的/upload_video
步骤01-web01上面创建挂载点/upload_video
[root@m01 ~]# ansible web -m file -a 'path=/upload_video state=directory'
步骤02-挂载nfs
[root@m01 ~]# ansible web -m mount -a 'fstype=nfs src=172.16.1.31:/data path=/upload_video state=mounted'
[root@m01 ~]# ansible web -a 'df -h'
172.16.1.7 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 12M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/mapper/centos_lichengbo--mobanji-root 50G 2.0G 48G 4% /
/dev/sda1 1014M 138M 877M 14% /boot
/dev/mapper/centos_lichengbo--mobanji-home 46G 33M 46G 1% /home
tmpfs 394M 0 394M 0% /run/user/0
172.16.1.31:/data 50G 2.1G 48G 5% /upload_video
[root@m01 ~]# ansible web -a 'tail -2 /etc/fstab'
172.16.1.7 | CHANGED | rc=0 >>
/dev/mapper/centos_lichengbo--mobanji-swap swap swap defaults 0 0
172.16.1.31:/data /upload_video nfs defaults 0 0
5.2 cron定时任务模块
cron模块 定时任务模块 | 定时任务配置中的内容 | |
---|---|---|
name | #及后面的内容 | 定时任务名字(一定要加上),对应下面注释的内容 |
minute | 分钟 minute="*/2" ,如果没有用到不用填写即可 | |
hour | 小时 | |
day | 日期 | |
month | 月份 | |
week | 周几 | |
job | 命令/脚本 | 指定命令或脚本(定向到空) job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" |
state | present 默认是添加 添加定时任务 absent 删除 |
案例01:添加自动同步时间的定时任务
第一步:备份定时任务
ansible all -a 'cp /var/spool/cron/root /tmp/'
ansible all -a 'ls -l /tmp/root'
ansible all -a 'crontab -r'
第二步:书写定时任务
ansible all -m cron -a 'name="sync time by lichengbo 20230725" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
6. 用户管理模块
- group创建组模块
- user创建用户模块🌟🌟🌟
6.1 user 🌟🌟🌟🌟🌟
user模块 | |
---|---|
name | www 用户名 |
uid | 指定uid |
group | 指定用户组 |
shell | 指定命令解释器 |
create_home | 是否创建家目录(yes/no) |
state | present 添加 absent 删除 |
案例01:创建用户lichengbo
ansible web -m user -a 'neme=lichengbo'
案例02:创建虚拟用户tengine,指定uid为10086
- 命令解释器:/sbin/nologin
- 不创建家目录
useradd -u 10086 -s /sbin/nologin -M tengine
[root@m01 ~]# ansible web -m user -a 'name=tengine uid=10086 shell=/sbin/nologin create_home=no state=present'
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": false,
"group": 10086,
"home": "/home/tengine",
"name": "tengine",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 10086
}
[root@m01 ~]# ansible web -a 'id tengine'
172.16.1.7 | CHANGED | rc=0 >>
uid=10086(tengine) gid=10086(tengine) groups=10086(tengine)
[root@m01 ~]# ansible web -a 'grep tengine /etc/passwd'
172.16.1.7 | CHANGED | rc=0 >>
tengine:x:10086:10086::/home/tengine:/sbin/nologin
6.2group模块
group | |
---|---|
name | 指定用户组名字 |
gid | 指定用户组gid |
state | present 添加 absent 删除 |
8. Ans模块实战-部署rsync服务端
8.1 列出流程
- 部署rsync服务端需要什么模块与流程
- 1️⃣服务部署:yum 安装或更新
- 2️⃣配置文件
- 3️⃣虚拟用户
- 4️⃣密码文件和权限
- 5️⃣模块对应目录,改所有者
- 6️⃣重启服务
8.2 根据流程找出命令(ans-模块)
- 现在是在管理机上
部署rsync服务端 | 命令 | |
---|---|---|
1️⃣是否能用yum | yum install -y rsync |
|
2️⃣配置文件 | 先准备好配置文件,scp 传输到rsync服务器上 | |
3️⃣虚拟用户 | useradd -s /sbin/nologin -M rsync |
|
4️⃣密码文件和权限 | echo 'rsync_backup:1' >/etc/rsync.password 然后修改权限 chomd 600 /etc/rsync.password |
|
5️⃣模块对应目录,改所有者 | mkdir -p /data chown rsync.rsync /data |
|
6️⃣重启服务 | systemctl start rsyncd systenctl enable rsyncd |
|
7️⃣检查 |
- 配置文件
##rsyncd.conf start##
##rstncd 2022111
fake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[data]
comment = "backup dir by oldboy lidao996"
path = /data
[backup]
comment = "backup dir by oldboy lidao996"
path = /backup
[nfsbackup]
comment = "nfsbackup dir by lidao996"
path = /nfsbackup
8.3 根据命令对应操作选择ans模块
部署rsync服务端 | 命令 | Ansible模块 |
---|---|---|
1️⃣是否能用yum | yum install -y rsync |
yum模块 |
2️⃣配置文件 | 先准备好配置文件,scp 传输到rsync服务器上 | copy模块 |
3️⃣虚拟用户 | useradd -s /sbin/nologin -M rsync |
user模块 |
4️⃣密码文件和权限 | echo 'rsync_backup:1' >/etc/rsync.password 然后修改权限 chomd 600 /etc/rsync.password |
file模块 |
5️⃣模块对应目录,改所有者 | mkdir -p /data chown rsync.rsync /data |
file模块 |
6️⃣重启服务 | systemctl start rsyncd systenctl enable rsyncd |
systemd模块 |
7️⃣检查 |
8.4 根据选择的模块实现对应的功能
部署rsync服务端需要什么模块与流程
- 1️⃣服务部署:yum 安装或更新
- 2️⃣配置文件
- 3️⃣虚拟用户
- 4️⃣密码文件和权限
- 5️⃣模块对应目录,改所有者
- 6️⃣重启服务
1)服务部署:yum 安装或更新
ansible backup -m yum -a 'name=rsync state=latest'
2) 配置文件分发
1.创建存放配置文件的目录
mkdir -p /server/ans/pro-rsync
2.准备好配置文件,存放在上面目录中
vim reyncd.conf
3.分发文件
ansible backup -m copy -a 'src=/server/ans/pro-rsync/rsyncd.conf dest=/etc/rsyncd.conf backup=yes'
3) 创建虚拟用户 rsync
ansible backup -m user -a 'name=rsync shell=/sbin/nologin create_home=no state=present'
4) 密码文件和权限
1.创建文件
ansible backup -m file -a 'path=/etc/rsync.password mode=600 state=touch'
2.增加内容
ansible backup -m lineinfile -a 'path=/etc/rsync.password line="rsync_backup:1"'
5)模块对应目录,改所有者
ansible backup -m file -a 'path=/data owner=rsync group=rsync state=directory'
6)重启服务
ansible backup -m systemd -a 'name=rsyncd enabled=yes state=started'
7) 命令测试
[root@m01 /server/ans/pro-rsync]# rsync -av /etc/hostname rsync_backup@172.16.1.31::data
Password:
sending incremental file list
hostname
sent 102 bytes received 43 bytes 96.67 bytes/sec
total size is 4 speedup is 0.03
8)指定hosts文件的位置
[root@m01 /server/ans/pro-rsync]# tree
.
├── hosts
└── rsyncd.conf
0 directories, 2 files
[root@m01 /server/ans/pro-rsync]# ansible -i hosts all -m ping
8.5 总结
- ⚠️仅用于展示,未来批量管理rsync服务或其他服务,要使用ansible playbook剧本
- 只是用来掌握部署某个服务的流程
9. Ansible-playbook(剧本)
9.1 概述
-
如同我们作为导演,编排一出戏,通过你设置步骤,让演员做对应动作操作
-
剧本核心:指定主机,执行什么任务(模块),什么操作(选项)
-
Ansible ad-hoc VS playbook区别
含义 | 应用场景 | |
---|---|---|
ad-hoc | ans命令运行对应模块与选项(类似与命令) | 临时,测试 |
playbook | 通过文件执行(类似与脚本) | 用于批量管理,部署,收集信息,分发软件 |
- playbook剧本 VS shell脚本
剧本与脚本 | 应用场景 |
---|---|
playbook剧本 | 批量管理,批量部署,批量分发.... |
shell脚本 | 某一台,服务脚本,系统巡检,定时备份 |
9.2 Playbook剧本极速上手指南
- 剧本格式叫yaml格式yml
- 缩进,不要用tab键
- 核心格式剧本中所有的内容要对齐
- 对齐的时候不能使用tab键
- 只能使用空格,2个空格
- hosts用于指定在哪些主机区执行指令
- tasks:用于对于这些主机,运行什么模块及选项
1) 案例01:在所有机器的/tmp下创建lidao.txt
1.编写剧本
[root@m01 /server/ans/playbook]# cat 01.touch.yml
---
- hosts: all
vars:
filename: lidao.txt
tasks:
- name: touch file
shell: touch /tmp/{{ filename }}
2.执行剧本
[root@m01 /server/ans/playbook]# cp /etc/ansible/hosts . 注意这里要把配置文件复制到Playbook目录中
[root@m01 /server/ans/playbook]# ansible-playbook -i hosts 01.touch.yml
2)案例02:添加定时同步时间的定时任务
- 原始命令行的ansible命令:
ansible all -m cron -a 'name="sync time by lichengbo 20230725" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
- 修改为剧本之后
#简单粗暴版
---
- hosts: all
tasks:
- name: add cron sync time
cron: name="sync time by lichengbo 20230725" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present
#格式优化后
---
- hosts: all
tasks:
- name: add cron sync time
cron:
name: "sync time by lichengbo 20230725"
minute: "*/2"
job: "/sbin/ntpdate ntp1.aliyun.com &>/dev/null"
state: present
- 注:加- C 是测试这个剧本,但不执行。
- 在剧本中使用模块和选项
- 选项最好是一行一个选项,选项后面的跟着冒号
- 选项要对齐与缩进.
3) 案例03:企业案例-批量下载安装zabbix-gaent2客户端并启动
- zabbix-agent2客户端
- 1️⃣下载rpm包
- 2️⃣安装rpm包
- 3️⃣启动服务zabbix-agent2
zabbix-agent2客户端 | 命令 | 模块 |
---|---|---|
1️⃣下载rpm包 | wget | get_url |
2️⃣安装rpm包 | rpm/yum | yum |
3️⃣启动服务zabbix-agent2 | systemctl | systemd |
- 模块对应命令:
下载地址:https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.0-1.el7.x86_64.rpm
[root@m01 /server/ans/playbook]# cat 03.install-zbbix-agent2.yml
---
- hosts: all
tasks:
- name: 1. download zabbix agent2 rpm
get_url:
url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.0-1.el7.x86_64.rpm
dest: /tmp/
validate_certs: no
- name: 2. install zabbix agent2 rpm
yum:
name: /tmp/zabbix-agent2-6.0.0-1.el7.x86_64.rpm
state: installed
- name: 3. start zabbix agent2 service
systemd:
name: zabbix-agent2
enabled: yes
state: started
[root@m01 /server/ans/playbook]# ansible-playbook -i hosts 03.install-zbbix-agent2.yml
4)案例04:部署rsync服务端(剧本)
- 准备:当前目录中包含,rsyncd.conf配置文件
# 1)服务部署:yum 安装或更新
ansible backup -m yum -a 'name=rsync state=latest'
# 2) 配置文件分发
1.创建存放配置文件的目录
mkdir -p /server/ans/pro-rsync
2.准备好配置文件,存放在上面目录中
vim reyncd.conf
3.分发文件
ansible backup -m copy -a 'src=/server/ans/playbook/rsyncd.conf dest=/etc/rsyncd.conf backup=yes'
# 3) 创建虚拟用户 rsync
ansible backup -m user -a 'name=rsync shell=/sbin/nologin create_home=no state=present'
# 4) 密码文件和权限
1.创建文件
ansible backup -m file -a 'path=/etc/rsync.password mode=600 state=touch'
2.增加内容
ansible backup -m lineinfile -a 'path=/etc/rsync.password line="rsync_backup:1"'
# 5)模块对应目录,改所有者
ansible backup -m file -a 'path=/data owner=rsync group=rsync state=directory'
# 6)启动服务
ansible backup -m systemd -a 'name=rsyncd enabled=yes state=started'
- 部署rsync服务剧本
[root@m01 /server/ans/playbook]# cat 04-backup-rsyncd.yml
---
- hosts: backup
tasks:
- name: 1. 服务部署:yum 安装或更新
yum:
name: rsync
state: latest
- name: 2. 配置文件分发
copy:
src: /server/ans/playbook/rsyncd.conf
dest: /etc/rsyncd.conf
backup: yes
- name: 3. 虚拟用户 reync
user:
name: rsync
shell: /sbin/nologin
create_home: no
state: present
- name: 4. 密码文件和权限
lineinfile:
path: /etc/rsync.password
mode: 0600
line: rsync_backup:1
create: yes
- name: 5. 模块对应目录,改所有者
file:
path: /data/
owner: rsync
group: rsync
state: directory
- name: 6. 启动服务
systemd:
name: rsyncd
enabled: yes
state: started
10.Ansible-变量系列
10.1 变量分类
变量 | |
---|---|
命令行 | 临时使用,较少用 |
变量文件vars_file | 某一个主机使用,较少用 |
主机组共用的变量文件 groups_vars | 应用范围广泛 |
Ansible内置变量(facts变量) | 收集主机的基本信息,ip地址,主机名,系统及版本... |
register变量 | 实现命令行 &() 或 `` 功能 |
10.2 变量详解
1)在剧本中定义变量,vars_files , group_vars
- 剧本中定义变量
[root@m01 /server/ans/playbook]# cat 06.vars_dir.yml
---
- hosts: all
vars:
dir_name: /oldboy_lidao
file_name: lidao996.icu
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory
- name: 02. touch
file:
path: "{{ dir_name}}/{{file_name}}"
state: touch
- 把变量存放到一个文件中,剧本比较大的时候
[root@m01 /server/ans/playbook]# cat vars.yml
dir_name: /oldboy_lidao
file_name: lidao996.icu
[root@m01 /server/ans/playbook]# cat 07.vars_files_dir.yml
---
- hosts: all
vars_file: ./vars.yml
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory
- name: 02. touch
file:
path: "{{ dir_name}}/{{file_name}}"
state: touch
- 创建一个变量文件,给某个组共用🌟🌟🌟🌟🌟
用法:需要创建一个group_vars目录,目录下面创建以主机组命名的目录,存放变量文件vars.yml
group_vars/ 目录
lb/vars.yml 存放lb组的变量
web/vars.yml 存放web组的变量
data/vars.yml 存放data组的变量
all/vars.yml 所有主机共用的变量
案例01-根据不同主机组创建对应的目录
group_vars/ 目录
web/vars.yml 存放web组的变量
data/vars.yml 存放data组的变量
web服务器创建 /app/code/目录
dir_name: /app/code
data服务端创建/data/目录
dir_name: /data/
group_vars/
├── data
│ └── vars.yml
└── web
└── vars.yml
3 directories, 3 files
#剧本内容
[root@m01 /server/ans/playbook]# cat
09.vars_group_vars_dir.yml
- hosts: all
tasks:
- name: 根据主机创建不同的目录
file:
path: "{{ dir_name }}"
state: directory
案例02-使用group_vars的all组定义变量
[root@m01 /server/ans/playbook]# tree group_vars/
group_vars/
├── all
│ └── vars.yml
├── data
│ └── vars.yml
└── web
└── vars.yml
3 directories, 3 files
[root@m01 /server/ans/playbook]# cat 09.vars-group_vars.yml
- hosts: all
tasks:
- name: {{ dir_name_doce }}
file:
path: "{{ dir_name_doce }}"
state: direcory
- name: 02 {{ dir_name_data }}
file:
path: "{{dir_name_data}}"
state: direcory
剧本目录,目录结构
[root@m01 /server/ans/playbook]# tree
.
├── 01.touch.yml
├── 02.add-cron.yml
├── 03.add-cron-you.yml
├── 04.install-zabbix-agent2.yml
├── 05-backup-resyncd.yml
├── 06-nfs-server.yml
├── 07.vars_dir.yml
├── 08.vars_files_dir.yml
├── 09.vars_group_vars_dir.yml
├── group_vars
│ ├── all
│ │ └── vars.yml
│ ├── data
│ │ └── vars.yml
│ └── web
│ └── vars.yml
├── hosts
├── rsyncd.conf
└── vars.yml
4 directories, 15 files
- 变量基础定义小结
使用方法 | 具体含义 | 应用场景 |
---|---|---|
变了写在剧本开头 | vars: | 简单的较少的可以用这一种 |
变量写在独立文件中 | vars_files:指定变量文件位置 | 了解即可 |
变量写在独立文件中,按照组进行分类 | group_vars/目录 all/vars.yml |
掌握all中创建所有主机/分组用的变量即可 |
2)Ansible-facts变量
- facts变量说明:ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息。
#查看 ansible facts变量内容
ansible -i hosts web -m setup
常用fact变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4.address #默认的网卡ip eth0
ansible_distribution #系统发行版本名字
CentOS Ubuntu Debian ...
ansible_processor_cores #核心总数
ansible_date_time.date #当前时间 年-月-日
案例01-系统巡检-获取所有机器的基础信息保存到/tmp/主机名命名的文件中
[root@m01 /server/ans/playbook]# cat 10.vars_sys_info.yml
---
- hosts: all
tasks:
- name: 创建文件并写入系统基本信息
lineinfile:
path: /tmp/{{ ansible_hostname }}
create: yes
line: "主机名:{{ ansible_hostname }}\nIP地址:{{ ansible_default_ipv4.address }}\n总内存:{{ ansible_memtotal_mb }}"
结果:
[root@m01 /server/ans/playbook]# ansible -i hosts web -a 'cat /tmp/web01'
主机名:web01
IP地址:10.0.0.7
总内存:3931
小结:
- 如果ans中使用到了一些系统的基础信息,eg:ip地址、主机名、时间。
- 如果没有这种需求或通过憋的方式实现这个需求,可以关闭facts功能,让剧本加速执行。使用gather_facts:no
---
- hosts: all
gather_facts: no
tasks:
- name: {{ dir_name_doce }}
file:
path: "{{ dir_name_doce }}"
state: direcory
- name: 02 {{ dir_name_data }}
file:
path: "{{dir_name_data}}"
state: direcory
3) ansible-register变量
- eg:创建压缩包压缩包名字包含时间。 tar打包压缩,date获取时间
tar zcf /tmp/etc-`date +%F`.tar.gz /etc/
案例01-创建以主机名命名文件/opt/主机名
步骤:
01.获取主机名:hostname
02.创建文件,使用上一步的结果
register: 变量名字 #这个变量的内容,叫json格式.
register: hostname #json格式,只想要输出标准输出 stdout standard output 标准输出.
hostname.stdout #取出命令的结果 `hostname`
[root@m01 /server/ans/playbook]# cat 11.vars_register.yml
---
- hosts: all
tasks:
- name: 01.获取主机名
shell: hostname
register: hostname
- name: 输出变量内容
debug:
msg: "{{ hostname.stdout }}"
- name: 02.创建文件
file:
path: /opt/{{ hostname.stdout }}
state: touch
- register变量输出的结果
{
"msg": {
"changed": true,
"cmd": "hostname",
"delta": "0:00:00.008150",
"end": "2022-04-14 12:32:14.587547",
"failed": false,
"rc": 0, #命令的返回值,0表示正确,非0错误.
"start": "2022-04-14 12:32:14.579397",
"stderr": "", #错误信息
"stderr_lines": [],
"stdout": "backup02", #这个最常用. 命令的结果,输出.
"stdout_lines": [
"backup02"
]
}
}
register: hostname
hostname.stdout #正常输出信息
hostname.rc #取出返回值.
hostname.stderr #取出错误信息.
10.3 Ansible变量小结
- 为何使用变量:
- 剧本,脚本使用的变量放在一个文件中或剧本的开头。
- 一般存放:用户名、用户组、目录、端口、......
变量 | ||
---|---|---|
命令行 | 临时使用,较少用 | |
剧本文件中vars定义 | 当前这个剧本生效,涉及多个剧本不方便 | |
变量文件vars_file | 所有变量写入到文件中:key:value 变量: 值 在剧本中通过vars_files:变量文件路径 ./vars.yml |
每次使用需要手动在剧本中加载。vars_files: ./vars.yml |
主机组共用的变量文件 groups_vars | 应用范围广泛. 根据主机清单里面的分组创建目录,存放vars.yml | 根据主句所属的主机组,自动读取group_vars/组名/vars.yml文件, group_vars/all/vars.yml |
Ansible内置变量(facts变量) | 收集主机的基本信息,ip地址,主机名,系统及版本... | 如果想要提升ans执行速度可以关闭gather_facts: no |
register变量(注册变量) | 实现命令行 &() 或 `` 功能 | 寄存器变量(注册,临时变量):把命令,模块结果,存放在reg格式变量中,通过变量.stdout 取出对应值 |
11. Ansible-进阶-剧本调试方法
11.1 概述
具体方法 | ||
---|---|---|
debug模块 | ||
tags 标签 | ||
忽略错误 |
11.2 debug模块
debug模块 | |
---|---|
msg | 相当于是echo命令,配合着register一起使用 |
案例01-调试-nfs服务端部署剧本
[root@m01 /server/ans/playbook]# cat 12.debug-nfs-server.yml
---
- hosts: nfs
tasks:
- name: 01. 部署nfs服务端软件
yum:
name: nfs-utils
state: installed
- name: 02. 修改配置文件
lineinfile:
path: /etc/exports
line: "/data 172.16.1.0/24(rw)"
state: present
backup: yes
- name: 03. 创建对应目录,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
register: file_jieguo
- name: 输出显示这个过程
debug:
msg: "{{ file_jieguo }}"
- name: 04. 启动rpc服务
systemd:
name: rpcbind
enabled: yes
state: started
- name: 05. 启动nfs服务
systemd:
name: nfs
enabled: yes
state: started
11.3 tags标签
- 一般用于调试剧本,给剧本的每个task可以设置个标签
- 运行剧本的时候可以运行指定标签
- 也可以运行剧本的时候排除某些标签
[root@m01 /server/ans/playbook]# cat 13.tags-nafs-server.yml
---
- hosts: nfs
tasks:
- name: 01. 部署nfs服务端软件
yum:
name: nfs-utils
state: installed
tags:
- install
- name: 02. 修改配置文件
lineinfile:
path: /etc/exports
line: "/data 172.16.1.0/24(rw)"
state: present
backup: yes
tags:
- conf
- conf_file
- name: 03. 创建对应目录,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
tags:
- conf
- conf_dir
- name: 04. 启动rpc服务
systemd:
name: rpcbind
enabled: yes
state: started
tags:
- start_srv
- name: 05. 启动nfs服务
systemd:
name: nfs
enabled: yes
state: started
tags:
- start_srv
运行指定标签
ansible-playbook -i hosts --tags conf 13.tags-nafs-server.yml
ansible-playbook -i hosts --tags conf_file,conf_dir 13.tags-nafs-server.yml
运行剧本的时候排除指定的标签
ansible-playbook -i hosts --skip-tags install,conf_file 13.tags-nafs-server.yml
11.4 忽略错误
- 用于运行剧本的时候,强制让某个任务(模块)运行,即使出错了,也不要中单我们的剧本
[root@m01 /server/ans/playbook]# cat 14.ignore-nfs-server.yml
---
- hosts: nfs
tasks:
- name: 01. 部署nfs服务端软件
yum:
name: nfs-utils
state: installed
ignore_errors: yes
tags:
- install
- name: 02. 修改配置文件
lineinfile:
path: /etc/exports
line: "/data 172.16.1.0/24(rw)"
state: present
backup: yes
tags:
- conf
- conf_file
- name: 03. 创建对应目录,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
tags:
- conf
- conf_dir
- name: 04. 启动rpc服务
systemd:
name: rpcbind
enabled: yes
state: started
tags:
- start_srv
- name: 05. 启动nfs服务
systemd:
name: nfs
enabled: yes
state: started
tags:
- start_srv
11.5 调试方法小结
具体方法 | ||
---|---|---|
debug模块 | 执行剧本的时候输出剧本的执行流程,一般配合register一起使用, 输出facts变量,自定义变量 | |
tags 标签 | 给一些模块加上标签,运行剧本的时候可以运行指定标签的内容,排除指定标签 | |
忽略错误 | 运行剧本的时候忽略一些模块的错误,让剧本继续运行 |
12. Ansible-进阶-进阶应用
- include
- handler
- when判断
- 循环
12.1 include功能
- include文件包含,把一个任务分成多个剧本来实现,书写个总剧本文件,通过include_tasks:引用子剧本文件
- ⚠️子剧本文件中只需要写模块部分(tasks部分即可)
12.2 handler
- handler 触发器
- 想表示:配置文件变化,再重启服务
##配置了handerles,只有服务配置文件发生变化了再重启服务
[root@m01 /server/ans/playbook]# cat 15.handler-nfs-server.yml
---
- hosts: db
tasks:
- name: 01.分发配置文件
copy:
src: ./exports
dest: /etc/exports
backup: yes
notify:
- restart nfs
handlers:
- name: restart nfs
systemd:
name: nfs
enabled: yes
state: started
12.3 when(判断)
-
when是ansible中的判断语句(条件语句)
-
实现对于某个模块满足或不满足某一条件下载执行
-
给web服务器或lb服务器配置nginx yum源
when: ( ansible_distribution == "Ubuntu" ) #如果系统的发行版本是Ubuntu则 运行模块 ansible_distribution ansible facts变量
when: ( ansible_hostname is match("web|lb")) #主机名包含web或lb 配置nginx源.
when: ( ansible_hostname is not match("web|lb") )
[root@m01 /server/ans/playbook]# cat nginx.repo
[nginx]
baseurl = http://nginx.org/packages/centos/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = nginx stable repo
[root@m01 /server/ans/playbook]# cat 16.when-fenfa-nginx-yum.yml
---
- hosts: all
tasks:
- name: 配置lb或web的nginx yum源
copy:
src: ./nginx.repo
dest: /etc/yum.repos.d/nginx.repo
backup: yes
when: ( ansible_hostname is match("web|lb") )
12.4 循环🌟🌟🌟🌟🌟
- 批量启动,重启服务
案例01-批量重启服务:crond,nfs,rpcbind
- 没学循环
- name: 01. 启动rpc服务
systemd:
name: rpcbind
enabled: yes
state: started
- name: 02. 启动nfs服务
systemd:
name: nfs
enabled: yes
state: started
- name: 03. 启动crond服务
systemd:
name: crond
enabled: yes
state: started
- 使用循环
[root@m01 /server/ans/playbook]# cat 17.item-restart-server.yml
---
- hosts: nfs
gather_facts: no
tasks:
- name: restart 多个服务
systemd:
name: "{{ item }}"
state: restarted
with_items:
- crond
- rpcbind
- nfs
案例02-添加用户并指定uid
- ansible中2个或多个变量的循环语句格式
用户名 | uid |
---|---|
lidao | 12307 |
oldboy996 | 12580 |
- hosts: all
gather_facts: no
tasks:
- name: 批量添加用户
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
state: present
with_items:
- { name: "lidoa", uid:"12307" }
- { name: "oldboy996", uid:"12580" }
Ans循环小结:
- with_items:实现循环,变了名字item
- 多个变量循环了解即可
12.5 jinja2模板
- 经常使用在配置文件中,让配置文件中包含变量
- copy模块不会解析变量
- template模块传输的时候解析配置文件中变量(ansible),配置文件格式改为 exports.j2
- 使用jinja2模板要求:
- 配置文件要以 .j2 结尾(ansible)
- 分发文件的时候,使用template模块,template与copy用法一致。
- jinja2循环
批量共享目录/data /backup /nfsdata
[root@m01 /server/ans/playbook]# cat 21-jinja-fenfa-conf.yml
---
- hosts: nfs
tasks:
- name: 分发nfs配置文件,加主机名
template:
src: ./exports.j2
dest: /etc/exports
[root@m01 /server/ans/playbook]# cat exports.j2
# {{ ansible_hostname }} nfs配置文件....
{% for name in [ "/data","/backup","/nfsdata" ] %}
{{ name }} 172.16.1.0/24(rw,all_squash)
{% endfor %}
12.6 Roles
- roles:规范剧本相关的目录。本质规定几个专用的目录
1)剧本nfs服务
---
- hosts: nfs
tasks:
- name: 01.部署nfs服务端软件
yum:
name: nfs-utils
state: installed
- name: 02.修改配置文件
template:
src: ./exports.j2
dest: /etc/exports
backup: yes
notify:
- 04.启动rpc-nfs服务
- name: 03.创建对应目录,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
handlers:
- name: 04.启动rpc-nfs服务
systemd:
name: "{{ item }}"
enabled: yes
state: restarted
with_items:
- rpcbind
- nfs
2) 剧本转换为roles格式
- roles结构
- 环境准备及部署流程
[root@m01 /server/ans/playbook/roles]# mkdir -p nfs-server/{flies,templates,tasks,handlers}
[root@m01 /server/ans/playbook/roles]# tree
.
└── nfs-server
├── flies
├── handlers
├── tasks
└── templates
5 directories, 0 files
1.先书写或者拆分中剧本中tasks的内容
[root@m01 /server/ans/playbook/roles]# cat nfs-server/tasks/main.yml
- name: 01.部署nfs服务端软件
yum:
name: nfs-utils
state: installed
- name: 02.修改配置文件
template:
src: ./exports.j2
dest: /etc/exports
backup: yes
notify:
- 04.启动rpc-nfs服务
- name: 03.创建对应目录,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
2.根据剧本,分类存放配置文件,模版文件(j2)
[root@m01 /server/ans/playbook/roles]# cp ../exports.j2 nfs-server/templates/
[root@m01 /server/ans/playbook/roles]# cat nfs-server/templates/exports.j2
# {{ ansible_hostname }} nfs配置文件....
/data 172.16.1.0/24 (rw,all_squash)
3.根据剧本,配置handlers的main.yml文件
[root@m01 /server/ans/playbook/roles]# cat nfs-server/handlers/main.yml
- name: 04.启动rpc-nfs服务
systemd:
name: "{{ item }}"
enabled: yes
state: restarted
with_items:
- rpcbind
- nfs
4.书写入口剧本(top.yml),与nfs-server目录同级
[root@m01 /server/ans/playbook/roles]# cat top.yml
---
- hosts: nfs
roles:
- role: nfs-server
[root@m01 /server/ans/playbook/roles]# tree -F
.
├── nfs-server/
│ ├── flies/
│ ├── handlers/
│ │ └── main.yml
│ ├── tasks/
│ │ └── main.yml
│ └── templates/
│ └── exports.j2
└── top.yml
5 directories, 4 files
3) roles执行流程
- ansible-playbook -i hosts top.yml
- 读取top.yml内容 获取roles信息
- 根据顺序先执行第1个role---->nfs-server
- 执行nfs-server,找nfs-server对应的目录.
- 执行里面的tasks下面的main.yml
- 执行main.yml的时候,遇到copy/template模块则找对应的目录copy(files),template(templates),找对应的文件。
- 执行main.yml的时候,遇到notify,则会找handlers下面的main.yml的内容,进行匹配与执行。
12.7 Galaxy
- 官方roles合集
ansible-galaxy install geerlingguy.nginx
/root/.ansible/roles/
12.8 ansible-vaulat 了解
- 加密文件
ansible-vault encrypt hosts #加密这个文件,设置密码
ansible --ask-vault-pass -i hosts all -m ping #使用ansible命令或ansible-playbook命令需要加上
--ask-vault-pass
13.ansible-进阶-优化
/etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #指定的默认的主机清单. 未来可以修改为 ./hosts 就可以不用加上-i
forks = 50 #并发数量. 可以增加这个数量获取更快批量管理效率.
sudo_user = root #配置下被管理端具有sudo权限的用户,并且修改/etc/sudoers 注释掉requiretty
host_key_checking = False #默认是True 连接新的主机要进行验证. 建议关闭,加速.
log_path = /var/log/ansible.log #默认没有开启.
ssh_args = -C -o ControlMaster=auto
-o ControlPersist=6d #连接的保持时间. 6d 10d
pipelining = True #加速,加速连接合并不必要的连接. 要求:不能使用sudo,如果使用则不能开启.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人