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服务,然后在升级 |
yum install -y telnet-server #服务端谁更新给谁按
systemctl start telnet.socket
telnet 10.0.0.31(ip)
有login提示即可使用telnet服务
注意⚠️必须用普通用户登陆
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客户端核心命令 | 作用 |
---|---|
scp | 远程传输命令 |
ssh | 命令行远程连接工具 |
sftp | ftp工具 |
[root@backup ~]# ssh -p 22 [email protected]
[email protected]'s password:
Last login: Mon Apr 11 17:57:29 2022
[root@backup ~]# ssh -p 22 [email protected] hostname
[email protected]'s password:
m01
[root@backup ~]#
window(MobaXterm)与linux之间
对于大文件推荐使用:scp/rsync/ftp传输
如果小文件:使用rz/sz即可
sftp 命令
xftp 图形化ftp工具
- m01:批量管理服务,要可以连接其他所有机器,存放密钥对
- backup. 被管理机
- nfs01。被管理机
- web01 被管理机
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 ~]#
#!/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
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管理端与其他机器配置好密钥认证
⚠️检验密钥认证结果
创建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命令格式 | |||
---|---|---|---|
ansible | 主机分组 | -m指定模块 | |
ansible | 主机分组 | -m指定模块 | -a 指定模块中的选项 |
module模块 | action动作 |
检验是否可以连通
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
ansible -i hosts all
ansible -i hosts all -m ping
模块分类 | |
---|---|
命令和脚本模块 | 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模块,用于检查/显示 变量 |
vim /server/scripts/yum.sh
yum install -y ipvsadm
#使用script执行
ansible web -m script -a '/server/scripts/yum.sh'
模块 | 含义 | 应用 |
---|---|---|
command模块 | 执行命令 | 简单的命令,不含特殊符号,默认的模块 |
shell模块 | 执行命令 | 执行特殊的符号:管道,反向引用,{},运行脚本 |
script模块 | 先传输脚本,在运行脚本 | 一般用于执行脚本 |
file模块中的选项 | |
---|---|
path | 路径(目录文件)必须要写 |
src | 源文件一般用于link(创建软连接模式)用于指定源文件 |
state | 状态(模式) state=directory 创建目录 state=file(默认)更新文件,如果文件不存在不会创建 state=link 创建软连接 state=touch 创建文件 state=absent删除 |
-ansible all -m file -a 'path=/oldboy/ state=directory'
-ansible all -a 'ls -dl /oldboy'
[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
ansible all -m file -a ' src="/kiku/kiku.txt" path="/tmp/kiku.soft" state=link '
ansible all -a 'ls -l /tmp/'
[root@m01 ~]# ansible all -m file -a 'path=/oldboy/oldboy.txt state=absent'
[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模块 | |
---|---|
src | source 源文件 |
dest | destination 目标 |
backup | backup=yes 会在覆盖前备份 |
mode | 修改权限 |
owner | 修改为指定所有者 |
group | 修改所有组 |
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/host'
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'
systemd模块 | |
---|---|
name | 用于指定服务名称 |
enabled | 控制服务的开机自启动 |
state | 表示服务状态 state=started 开启 state=stopped 关闭 state=restarted重启(关闭在开启) state=reloaded 重读配置文件(服务支持) |
daemon-reload | yes是否重新加载对应的服务的管理配置文件(systemctl配置文件.) |
[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
ansible all -m systemd -a 'name=sshd enabled=yes state=started'
ansible all -m systemd -a 'name=rsync enable=yes state=restarted'
服务管理 | systemd模块 | service模块 |
---|---|---|
开机自启动 | enabled | enabled |
服务名称 name | name | name |
服务开关重启 | state | state |
运行级别 | 无 | runlevel(运行级别) |
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]
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模块 | |
---|---|
name | 指定模块名字 |
state | installed安装(present) ,removed 删除(absent),latest安装或更新 |
- ansible all -a 'rpm -e lrzsz'
- ansible all -m yum -a 'name=lrzsz state=installed'
- ansible web -m yum -a 'name=sl,cowsay,aalib state=installed'
get_url下载功能 | |
---|---|
url | 指定要下载的地址 |
dest | 下载到目录 |
vaildate_certs=no | 加密时候 |
下载地址: 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 管理定时任务
- 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模块 定时模块 | 定时任务配置中的内容 |
---|---|
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'
user模块 | |
---|---|
name | 用户名 |
uid | 指定uid |
group | 指定用户组 |
shell | 指定命令解释器 |
create_home | 是否创建家目录(yes/no) |
state | present添加;absent删除 |
练习
ansible all -m user -a 'name=kiku state=present'
ansible all -m user -a 'name=tengine uid=10086 shell=/sbin/nologin create_home=no state=present'
group模块 | |
---|---|
name | 用户名 |
gid | 指定gid |
state | present添加;absent删除 |
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
- 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
变量 | |
---|---|
命令行 | 临时使用 |
变量文件vars_files | 某一个主机使用,较少用 |
主机组共用的变量文件group_vars | 应用范围广 |
ansible内置变量(facts变量) | 收集主机的基本信息,ip地址,主机名,系统版本… |
register变量 | 实现命令行$()或``功能 |
[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/
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 #当前时间 年-月-日
用于运行剧本的时候,强制让某个任务(模块)运行即使出错了,也不要中断我们的剧本
应用场景
include文件包含,把一个任务分成多个剧本来实现,书写一个总的剧本文件,通过include_tasks:引用子剧文件。
⚠️子剧文件中只需要些模块部分(tasks部分即可)
批量启动,重启服务
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
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" }
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