随笔 - 10  文章 - 0  评论 - 0  阅读 - 975

综合架构第二篇

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

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执行流程

  1. ansible-playbook -i hosts top.yml
  2. 读取top.yml内容 获取roles信息
  3. 根据顺序先执行第1个role---->nfs-server
  4. 执行nfs-server,找nfs-server对应的目录.
  5. 执行里面的tasks下面的main.yml
  6. 执行main.yml的时候,遇到copy/template模块则找对应的目录copy(files),template(templates),找对应的文件。
  7. 执行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,如果使用则不能开启.
posted on   lichengbo  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示