自动化工具ssh/scp/ansible

SSH服务概述

  • SSH服务- OpenSSH ,远程连接
  • 服务端:openssh-server
  • 客户端:openssh-clients
openssh-clients-7.4p1-21.el7.x86_64  #客户端
openssh-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64   #服务端

OpenSSH 与 Telnet

对比OpenSSH与telnet服务 共同点 区别 场景
OpenSSH 远程连接 连接时加密 默认使用
telnet 远程连接 连接时明文 未来升级Openssh,建议先安装telnet服务,然后在升级

telnet服务端使用-了解

yum install -y telnet-server  #服务端谁更新给谁按
systemctl start telnet.socket
telnet 10.0.0.31(ip)
有login提示即可使用telnet服务
注意⚠️必须用普通用户登陆

OpenSSH服务端配置

  • 概述
openssh服务端软件包内容
/etc/ssh/sshd_config #daemon守护进程/服务 #openssh服务端配置文件
/usr/lib/systemd/system/sshd.service openssh服务端管理文件(systemctl start/stop/restart sshd)
/usr/sbin/sshd openssh服务启动命令
[root@m01 ~]# ps -ef |grep /sbin/sshd
root       1405      1  0 15:18 ?        00:00:00 /usr/sbin/sshd -D
root       4940   4853  0 19:06 pts/2    00:00:00 grep --color=auto /sbin/sshd

服务端配置文件详解

配置文件
性能优化 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)

OpenSSH服务端命令

  • 概述
Openssh客户端核心命令 作用
scp 远程传输命令
ssh 命令行远程连接工具
sftp ftp工具

SCP

  • scp -r 递归传输目录
  • scp -P 指定ssh端口号,不指定默认22

SSH

远程连接10.0.0.41的22端口
[root@backup ~]# ssh -p 22 [email protected]
[email protected]'s password:
Last login: Mon Apr 11 17:57:29 2022
远程连接10.0.0.41的22端口并执行命令hostname后返回
[root@backup ~]# ssh -p 22 [email protected] hostname
[email protected]'s password:
m01
[root@backup ~]#

sftp

  • ftp:文件传输协议,服务端口号21端口,,一般用于传输比较大的数据:window-linux 类似rz 和sz.
window(MobaXterm)与linux之间
对于大文件推荐使用:scp/rsync/ftp传输
如果小文件:使用rz/sz即可
sftp 命令
xftp 图形化ftp工具
命令版本
  • 现在在10.0.0.31机器,连接10.0.0.41通过sftp
  • sftp [email protected]
    • put 上传
      • put /etc/hostname #把31的/etc/hostname上传到41
    • get 下载
      • get /etc/hostname #把41的/etc/hostname 下载到31上
    • 查看远程目录信息
      • ls
      • ls -l
    • 查看本地目录
      • lls -l #l是local
    • 删除远程文件/目录
      • rm
图形化界面版本
  • winscp,xxxftp, xshell,xftp

OpenSSH密钥认证

  • 密钥认证:免密码登录,双机互信

认证原理

实战使用

- m01:批量管理服务,要可以连接其他所有机器,存放密钥对
- backup. 被管理机
- nfs01。被管理机
- web01 被管理机
  • 创建密钥对。 ssh -keygen
  • 分发密钥(公钥) ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@ip
  • 测试. ssh 用户名@ip 命令
1.生成密钥对
[root@backup ~]# ssh-keygen
Generating public/private rsa key pair.#正在创建密钥对
Enter file in which to save the key (/root/.ssh/id_rsa):#回车 指定密钥对的位置
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:566wfwPlkirAJWT49Wq0O9OPn7z01qT2vBcRBMXXWeE root@backup
The key's randomart image is:
+---[RSA 2048]----+
| .          .=o.*|
|. o .         +.o|
| + . .         E |
|  o o .   .   .  |
| . + o  S+.    . |
|  o +   +o. . .  |
|   o o...o.+   . |
|    = o* +*.. .  |
|     +o+O*oo+o   |
+----[SHA256]-----+
2分发密钥(公钥)
[root@backup ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
/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.61 (10.0.0.61)' can't be established.
ECDSA key fingerprint is SHA256:WZ+slExT5N7kBgSdb1rqx65ix2vTyKIUZpFLe07WKtA.
ECDSA key fingerprint is MD5:06:46:11:50:2a:93:f5:f2:6d:08:ce:44:57:15:31:90.
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
[email protected]'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
3.测试
[root@backup ~]# ssh 10.0.0.61 hostname
m01
[root@backup ~]#

OpenSHH密钥认证一键化部署

一键化流程

  • 脚本创建密钥对,
    • ssh-keygen -f ~/.ssh/id_rsa -p’’
  • 分发密钥组(公钥)
    • sshpass -p 1 ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no [email protected]
    • sshpass 需要安装用yum
  • 脚本(测试)

一键化创建密钥和分发密钥

  • 脚本实现创建密钥对和分发
#!/bin/bash
# Author: kiku
# Time: 2020-04-30
# Description: Distribute the public key
# Define the variable

dir="$HOME/.ssh"
pass="toor"

# 01. 生成密钥对(Generating a key pair)
if [ -d $dir ]
then
    rm -f $dir/*
fi
echo "开始生成密钥对……"
ssh-keygen -t rsa -b 4096 -f $dir/id_rsa -P '' &>/dev/null
[ $? -eq 0 ] && echo "密钥对已生成" || echo "密钥对生成失败"
# 02. 检查是否安装 sshpass
rpm -qa|grep sshpass &>/dev/null
if [ $? -ne 0 ]
then
    echo "检测发现未安装 sshpass, 正在安装……"
    yum install sshpass -y &>/dev/null
fi

# 03. 分发公钥
echo "开始分发公钥……"
for ip in `cat ip.txt`
do
    sshpass -p$pass ssh-copy-id -i $dir/id_rsa.pub -o StrictHostKeyChecking=no root@$ip &>/dev/null
    [ $? -eq 0 ] && echo "$ip 已分发成功" || echo "$ip 分发失败"
done

ansible

什么是自动化批量管理

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin

  • 重复性工作内容:如何自动化
  • 部署环境,批量查看信息,批量检查:自动化

自动化管理工具

自动化批量管理工具 特点
ansible 基于python语言编写,使用极其简单,不需要客户端
saltstack 基于python语言编写,需要安装客户端
tereform 批量管理平台,批量创建阿里云服务器,批量创建aws服务器
fabric python使用它
chef 了解
puppet 古老的管理工具

ansible 架构

ansible极速使用指南

环境准备

⚠️ansible管理端与其他机器配置好密钥认证

⚠️检验密钥认证结果

创建ip.txt的文件写入想要批量管理的ip

#!/bin/bash

# Author: kiku
# Time: 2020-04-30
# Description: Distribute the public key

# Define the variable
dir="$HOME/.ssh"
pass="toor"

# 01. 生成密钥对(Generating a key pair)
if [ -d $dir ]
then
    rm -f $dir/*
fi
echo "开始生成密钥对……"
ssh-keygen -t rsa -b 4096 -f $dir/id_rsa -P '' &>/dev/null
[ $? -eq 0 ] && echo "密钥对已生成" || echo "密钥对生成失败"

# 02. 检查是否安装 sshpass
rpm -qa|grep sshpass &>/dev/null
if [ $? -ne 0 ]
then
    echo "检测发现未安装 sshpass, 正在安装……"
    yum install sshpass -y &>/dev/null
fi

# 03. 分发公钥
echo "开始分发公钥……"
for ip in `cat ip.txt`
do
    sshpass -p$pass ssh-copy-id -i $dir/id_rsa.pub -o StrictHostKeyChecking=no root@$ip &>/dev/null
    [ $? -eq 0 ] && echo "$ip 已分发成功" || echo "$ip 分发失败"
done

ansible部署

  • yum install -y ansible
ansible命令格式
ansible 主机分组 -m指定模块
ansible 主机分组 -m指定模块 -a 指定模块中的选项
module模块 action动作

初步配置主机清单

  • 主机清单默认/etc/ansible/hosts

与ansible的第一次接触

检验是否可以连通

  • ansible all -m ping

ansible中的颜色

  • 绿色表示正常
  • 黄色表示执行正常,状态变化.
  • 红色表示错误,输出错误信息
  • 紫色表示警告,建议.

ansible配置文件

  • 配置文件:/etc/ansible/ansible.cfg

ansible主机清单

基本格式/子组

cat /etc/ansible/hosts
[oldboy]     #[组名字]
172.16.1.7    管理的ip
172.16.1.31
[web]
172.16.1.51

[data:children] #子组:data:children表示 data是创建的子组 组里面包含 oldboy,web个组.
oldboy          #组名字
web             #组名字

指定用户名,密码,端口

主机清单中指定信息
连接ssh端口 ansible_ssh_port=22
连接ssh用户 ansible_ssh_user=root
连接ssh密码 ansible_ssh_pass=‘1’
[web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root 
ansible_ssh_pass='1'
[db]
172.16.1.51
[nfs]
172.16.1.31
[backup]
172.16.1.41

主机清单案例

[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
8) 指定hosts文件的位置
 ansible -i hosts all
ansible -i hosts all -m ping
查看与使用指定的子组data
  • ansible data -m commond -a ‘hostname’
查看指定的组web
  • ansible wed -m commond -a ‘hostname’
查看所有主机情况
  • ansible all -m commond -a ‘hostname’
查看某一台机器
  • ansible 172.16.1.7 -m command -a ‘hostname’

ansible 核心模块

  • AD-Hoc命令调用ansible模块

模块概述

模块分类
命令和脚本模块 command模块,默认模块,执行简单命令,不支持特殊符号
shell模块 执行命令,支持特殊符号
script模块 分发脚本
文件 copy 远程分发文件
file 创建目录 文件,软连接
服务 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模块,用于检查/显示 变量

如何查询帮助

  • 通过命令 ansible-doc -s command
  • 查看官网

ansible命令与脚本类模块

command模块
  • 仅支持简单命令,不支持特殊符号或通道
  • 这个模块是ansible默认模块,不加模块默认使用这个模块
  • ansible all -m command -a ‘命令’
  • ansible all -a ‘命令’ #相当于省略-m command
shell模块
  • 与command模块类似,shell模块支持特殊符号,执行脚本
  • 例:ansible all -m shell -a ‘ip a s eth0|sed -n 3p’
script模块-传输脚本到被管理端并执行脚本
  • 传输脚本/执行脚本
  • 卡住需要清理一下被管理机的缓存
  • 如果无法执行看一下管理机的yum repolist看yum源有没有问题
vim /server/scripts/yum.sh
yum install -y ipvsadm
#使用script执行
ansible web -m  script -a '/server/scripts/yum.sh'
命令与脚本
模块 含义 应用
command模块 执行命令 简单的命令,不含特殊符号,默认的模块
shell模块 执行命令 执行特殊的符号:管道,反向引用,{},运行脚本
script模块 先传输脚本,在运行脚本 一般用于执行脚本

ansible-文件与目录管理模块

file模块 创建文件目录

  • 管理文件或目录,软连接
file模块中的选项
path 路径(目录文件)必须要写
src 源文件一般用于link(创建软连接模式)用于指定源文件
state 状态(模式)
state=directory 创建目录
state=file(默认)更新文件,如果文件不存在不会创建
state=link 创建软连接
state=touch 创建文件
state=absent删除
创建目录/oldboy/目录
  • ansible all -m file -a ‘path=/oldboy state=directory’
-ansible all -m file -a 'path=/oldboy/ state=directory'
-ansible all -a 'ls -dl /oldboy'
创建文件/oldboy/oldboy.txt文件
  • ansible all -m file -a ‘path=/kiku/kiku.txt state=touch’
[root@m01 ~]# ansible all -m file -a 'path=/kiku/kiku.txt state=touch'
10.0.0.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/kiku/kiku.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
10.0.0.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/kiku/kiku.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
10.0.0.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/kiku/kiku.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
[root@m01 ~]# ansible all -a 'ls -l /kiku'
10.0.0.41 | CHANGED | rc=0 >>
总用量 0
-rw-r--r-- 1 root root 0 4月  13 09:22 kiku.txt
10.0.0.7 | CHANGED | rc=0 >>
总用量 0
-rw-r--r-- 1 root root 0 4月  13 09:22 kiku.txt
10.0.0.31 | CHANGED | rc=0 >>
总用量 0
-rw-r--r-- 1 root root 0 4月  13 09:22 kiku.txt
创建软连接/kiku/kiku.txt到/tmp/kiku.txt.soft
ansible all -m file -a ' src="/kiku/kiku.txt" path="/tmp/kiku.soft" state=link '
ansible all -a 'ls -l /tmp/'
删除文件/目录/软连接
  • ansible all -m file -a ‘path=/tmp/oldboy.txt.soft state=absent’
[root@m01 ~]# ansible all -m file -a 'path=/oldboy/oldboy.txt state=absent'

创建文件/tmp/oldboy.txt,所有者root,用户组root,权限755
[root@m01 ~]# ansible all -m file -a 'path=/tmp/kiku.txt mode=755 owner=root group=root state=touch'
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/tmp/kiku.txt",
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}

copy传输模块 远程传输文件,目录,类似于scp

  • ⚠️在传输的时候可能会压缩权限如果需要权限的要给设置权限mode
copy模块
src source 源文件
dest destination 目标
backup backup=yes 会在覆盖前备份
mode 修改权限
owner 修改为指定所有者
group 修改所有组
传输/etc/hosts文件到/etc/hosts
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/host'
传输/etc/hosts文件到/etc/hosts先备份在修改
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'

ansible-服务管理模块

  • 关闭/重启/启动 服务
  • 开机自启动/开机不启动

systemd

systemd模块
name 用于指定服务名称
enabled 控制服务的开机自启动
state 表示服务状态
state=started 开启
state=stopped 关闭
state=restarted重启(关闭在开启)
state=reloaded 重读配置文件(服务支持)
daemon-reload yes是否重新加载对应的服务的管理配置文件(systemctl配置文件.)
关闭firewalld
  • ansible all -m systemd -a ‘name=firewalld state=stopped enabled=no’
[root@m01 ~]# ansible all -m systemd -a 'name=firewalld state=stopped'

#检查             
[root@m01 ~]# ansible all -m shell -a 'systemctl status firewalld'
172.16.1.41 | FAILED | rc=3 >>
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)non-zero return code        
开启sshd服务
ansible all -m systemd -a 'name=sshd enabled=yes state=started'
重启backup这台机器上面的rsync服务
ansible all -m systemd -a 'name=rsync enable=yes state=restarted'
service了解
服务管理 systemd模块 service模块
开机自启动 enabled enabled
服务名称 name name name
服务开关重启 state state
运行级别 runlevel(运行级别)

ansible

Ans-软件包管理模块

  • yum_repository (管理yum源)
  • yum (命令)
  • get_url(wget命令)

yum源配置管理模块

yum源yum_repository yum源配置文件内容
name [epel] yum源中名字(括号里的名字即可)
description name= yum源注释说明
baseurl baseurl= yum源中下载软件包的地址(可以访问repodata目录)
enabled=yes 或no enabled=1或0 是否启动这个源
gpgcheck=yes 或no gpgcheck=0 是否启动检查功能
file(可以不加) 指定yum源的文件 自动添加 .repo file=lidao 致

批量添加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
ansible web  -m yum_repository   -a 'name=nginx 
description="nginx stable repo" 
baseurl="http://nginx.org/packages/centos/$releasever
/$basearch/" gpgcheck=no             enabled=yes'

yum模块

  • 通过yum命令安装软件
yum模块
name 指定模块名字
state installed安装(present) ,removed 删除(absent),latest安装或更新

安装lrsz

- ansible all -a 'rpm -e lrzsz'
- ansible all -m yum -a 'name=lrzsz state=installed'

安装sl .cowsay,aalib

- ansible web  -m yum -a 'name=sl,cowsay,aalib state=installed'

get_url 模块(wget)

get_url下载功能
url 指定要下载的地址
dest 下载到目录
vaildate_certs=no 加密时候

下载tengine源码包到/server/tools/(不存在)目录下

下载地址: https://tengine.taobao.org/download/tengine-
2.3.3.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-2.3.3.tar.gz   dest=/server/tools/'
ansible web -a 'tree /server/'  

系统管理模块

mount 挂载nfs模块
cron 管理定时任务

mount模块

mount
- fstype  指定文件(nfs)
- src  源地址(nfs服务地址)

- path 挂载点(要把源地址挂载到哪里)
- state :
  - absent.           卸载并修改(fstab)清理配置
  - unmounted    卸载不修改(fstab)
  - present           仅修改(fstab)不挂载
  - mounted         挂载并修改(fstab)永久挂载
  - remounted     重新挂载

练习
#1.web01把 nfs共享的目录/data目录挂载到 web01的/upload_video

ansible -i hosts -m mount -a '[email protected]:/data path=/upload_video fstype=nfs state=mounted'

cron定时任务模式

cron模块 定时模块 定时任务配置中的内容
name #及后面的内容(定时任务名字一定要加上,对应下面的注释内容)
minute */2 分钟,如果没有用到不用填
hour 小时
day 日期
month 月份
week
job 命令/脚本
state present默认是添加定时任务;absent删除

#添加自动同步时间的定时任务

ansible all -m cron -a 'name="update sunju0414" minute=*/2 hour=* day=* month=*
week=* job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'

用户管理模块

  • gruop创建组模块
  • user创建用户模块

user用户模块

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

练习

  1. 创建用户kiku
ansible all -m user -a 'name=kiku state=present'
  1. 创建虚拟用户tengine,指定uid为10086
ansible all -m user -a 'name=tengine uid=10086 shell=/sbin/nologin create_home=no state=present'

group模块

group模块
name 用户名
gid 指定gid
state present添加;absent删除

ansible模块 ,部署rsync服务端

1) 服务部署:yum 安装或更新
ansible backup  -m yum  -a 'name=rsync state=lastest'
2) 配置文件分发  #准备配置文件存放在 目录中 rsyncd.conf
ansible backup  -m copy  -a 'src=/server/ans/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)密码文件和权限
 ansible backup -m file -a 'path=/etc/rsync.password   mode=600 state=touch'
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) 命令行测试
rsync

Ansible-playbook(剧本)

  • 命令:
    • -i
    • -C
    • –syntax-check
    • –skip-tags
    • -t. 标签 --tags 标签 运行指定的标签

Playbook剧本极速使用指南

  • 剧本格式叫yaml格式yml
  • 缩紧不能用tab键只能用空格
  • 核心格式剧本中所有的内容要对齐
  • 对齐的时候不能使用tab键.
  • 只能使用空格,2个空格.
  • hosts:用于指定在哪些主机执行指令.
  • tasks: 用于对于这些主机,运行什么模块及选项.
  • 在剧本中使用模块和选项
  • 选项最好是一行一个选项,选项后面的跟着冒号
  • 选项要对齐与缩进.
- host
  remote_user: root
  var:
    file_name: linux
  tasks:
    - name:
      shell: touch /tmp/kiku.txt

练习
#案例01:在所有机器的/tmp下面创建kiku.txt

[root@m01 /server/ans/playbook]# cat 01.touch.yml 
- hosts: all
 vars:
   filename: kiku.txt
 tasks:
    - name: touch file
     shell: touch /tmp/{{ filename }} 
 ansible-playbook -i hosts 01.touch.yml

Ansible 变量系列

变量分类

变量
命令行 临时使用
变量文件vars_files 某一个主机使用,较少用
主机组共用的变量文件group_vars 应用范围广
ansible内置变量(facts变量) 收集主机的基本信息,ip地址,主机名,系统版本…
register变量 实现命令行$()或``功能

变量详解

1) vars,vars_files , group_vars

  • 用法
  • 创建一个变量文件,给某个组共用⭐
  • 把变量存放到一个文件中. 剧本比较大的时候.
  • 剧本中定义变量. ⭐
[root@m01 /server/ans/playbook]# cat 07.vars_dir.yml 
---
- hosts: all
 vars:
   dir_name: /kiku
   file_name: kiku05.icu
 tasks:
    - name: 01. mkdir
     file:
       path: "{{ dir_name }}"
       state: directory
    - name: 02. touch
     file:
       path: "{{ dir_name }}/{{ file_name }}"
       state: touch
1 group_vars/ 目录
2   web/vars.yml #存放web组的变量
3   data/vars.yml #存放xxx组的变量
4   all/vars.yml  #所有主机共用的变量  	常用
5 web服务器创建 /app/code/目录
6 dir_name: /app/code/
7 data服务端创建 /data/目录
8 dir_name: /data/
9
10 #参考:
12 变量文件内容
13
14 [root@m01 /server/ans/playbook]# cat 
group_vars/data/vars.yml 
15 dir_name: /datav2/
16 [root@m01 /server/ans/playbook]# cat 
group_vars/web/vars.yml 
17 dir_name: /app/code/

2)ansible-facts变量

  • facts变量说明 : ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息.

  • 如果ans中使用到了一些系统的基础信息. eg: ip地址,主机名,时间.

    如果没有这种需求或通过别的方式实现这个需求,可以关闭facts功能,让剧本执行加速. 使用gather_facts: no

2 #查看 ansible facts变量内容
3 ansible  -i hosts web    -m setup
456 常用fact变量
7 ansible_hostname               #主机名
8 ansible_memtotal_mb            #内存大小(总计) 单位mb 
9 ansible_processor_vcpus        #cpu数量
10 ansible_default_ipv4.address   #默认的网卡ip eth0
11 ansible_distribution           #系统发行版本名字
CentOS Ubuntu Debian ՎՎʢ
12 ansible_processor_cores        #核心总数
13 ansible_date_time.date         #当前时间 年-月-日
  1. ansible-register变量

  • 创建压缩包压缩包名字包含时间. tar打包压缩,date获取时间.

ansible-进阶剧本调试方法

  • debug 模块
  • tags 标签
  • 忽略错误

debug模块

  • msg. 相当无echo命令 ,配合register一起用

tags标签

  • 一般用于调试剧本,给剧本每一个tasks可以设置一个标签
  • 运行剧本的时候可以运行指定的标签
  • 运行剧本的时候排除某些标签

忽略错误

用于运行剧本的时候,强制让某个任务(模块)运行即使出错了,也不要中断我们的剧本

调试方法小结

应用场景

  • debug。 :执行脚本的时候输出剧本的执行流程,一般配合register一起使用,输出facts变量。自定义变量
  • tags :给一些模块加上标签,运行剧本的时候可以运行指定标签的内容,排除指定标签
  • 忽略错误 :运行脚本的时候忽略一些模块的错误,让剧本继续运行

ansible-进阶应用

  • include
  • handler
  • when判断
  • 循环

includle功能

include文件包含,把一个任务分成多个剧本来实现,书写一个总的剧本文件,通过include_tasks:引用子剧文件。

⚠️子剧文件中只需要些模块部分(tasks部分即可)

handlers

  • handlers触发器(条件),满足条件后在做什么事情
  • 应用场景:想表示:配置文件变化,再重启配置文件是否变化

when判断

  • when是ansible中的判断语句(条件语句)
  • 实现对于某个模块在满足或不满足----条件下在执行
  • 给web服务器或lb服务器配置nginxyum源
  • when一般与ansible facts变量一起使用,判断主机/判断系统类型
  • when也可以与register变量 一起搭配
  • {{ item }}
  • with_tiems
  • with_items: 实现循环,变量名字item
  • 多个变量循环了解即可.
  • 注:这里的with_items可以替换成loop.

循环

批量启动,重启服务

批量重启服务:cronf,nfs,rpcbind

1 [root@m01 /server/ans/playbook]# cat 19-itemrestart-service.yml 
3 - hosts: nfs
4 gather_facts: no
5 tasks:
6    - name: restart 多个服务
7     systemd:
8       name: "{{ item }}"
9       state: restarted
10     with_items:
11        - crond
12        - rpcbind
13        - nfs

循环添加用户并指定uid

  • ansible中2个或多个变量的循环语句格式
1 - hosts: all
2 gather_facts: no
3 tasks:
4    - name: 批量添加用户
5     user:
6       name: "{{ item.name }}"
7       uid:  "{{ item.uid }}"
8       state: present 
9     with_items:
10        - { name: "kiku",     uid: "12307" }
11        - { name: "kiku05", uid: "12580" }

jinja2模版

  • 经常使用在配置文件中,让配置文件中包含变量
  • copy模块就没有解析变量
  • template模块传输的时候解析配置文件变量(ansible),配置文件格式改为exports.j2
  • 使用jinja2模块要求
    • 配置文件要以.j2结尾(ansible)
    • 分发文件的时候,使用template模块,template用法与copy一致
1 root@m01 /server/ans/playbook]# cat 21-jinja-fenfaconf.yml
2 ---
3 - hosts: nfs
4 tasks:
5    - name: 分发nfs配置文件,加主机名
6     template:
7       src: ./exports.j2
8       dest: /etc/exports
9 [root@m01 /server/ans/playbook]# cat exports.j2
10 # {{ ansible_hostname }} nfs配置文件加主机名
11 /data   172.16.1.0/24(rw,all_squash

roles

  • roles:规范剧本相关目录,本质规定的几个专用目录

环境准备及部署流程

  • 先书写或拆分剧本中tasks的内容
  • 根据剧本分类存放配置文件模板文件(j2)
  • 根据剧本**配置handlers的main.yml文件
  • 书写入口剧本与nfs-server目录
  • 先书写或拆分剧本中tasks的内容. /tasks/
  • 根据剧本,分类存放配置文件,模版文件(j2)/templates/
  • 根据剧本,配置handlers的main.yml文件 /handlers/
  • 书写入口剧本,与nsf-server目录同级 /top.yml

roles执行流程

  • 读取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的内容,进行匹配与执行。

galaxy

  • 官方roles集合
  • 储存路径/root/.ansible/roles/

ansible-vault

  • 加密文件
  • ansible-vault encrypt hosts. #加密文件设置密码
  • ansible --ask-vault-pass -i hosts all -m ping. #使用ansible命令或ansible-playbook命令也是要加上–ask-vault-pass

ansible优化

  • /etc/ansible/ansible.cfg 是ansible的配置文件

你可能感兴趣的:(Linux基础服务,运维)