mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

22_Linux基础-ansible1

一. selinux、established#

示例1:永久修改selinux
--------------------------------------------------------------------------------------------
[root@cPen_A ~]# vim /etc/selinux/config 
SELINUX=disabled
============================================================================================
示例:排查连接不上	4.00 - 9.00没写完
ps -ef igrep sshd
lsof -i:2233
cat /etc/services

[root@cPen_B ~]# netstat -anplut igrep ssh
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:2233            0.0.0.0:*               LISTEN      911/sshd            
tcp        0     36 192.168.0.31:2233       192.168.0.42:54290      ESTABLISHED 1402/sshd: root [pr 
tcp6       0      0 :::2233                 :::*                    LISTEN      911/sshd            
udp        0      0 192.168.0.31:68         192.168.0.250:67        ESTABLISHED 893/NetworkManager  
[root@cPen_B ~]# netstat -aplut igrep ssh
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:infocrypt       0.0.0.0:*               LISTEN      911/sshd            
tcp        0     36 cPen_B:infocrypt        192.168.0.42:54290      ESTABLISHED 1402/sshd: root [pr 
tcp6       0      0 [::]:infocrypt          [::]:*                  LISTEN      911/sshd            
udp        0      0 cPen_B:bootpc           192.168.0.250:bootps    ESTABLISHED 893/NetworkManager 
##############################################################################################################
示例2:看当前系统有多少连接 (establish)
--------------------------------------------------------------------------------------------
[root@cPen_B ~]# netstat -anplut|grep -E "ESTABLISHED|LISTEN|TIME_WAIT"|awk -F" " {'print $6'}|sort|uniq -c
      2 ESTABLISHED
      2 LISTEN
#-------------------------------------------------------------------------------
[root@cPen_B ~]# netstat -anplut
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:2233            0.0.0.0:*               LISTEN      911/sshd            
tcp        0    232 192.168.0.31:2233       192.168.0.42:54290      ESTABLISHED 1402/sshd: root [pr 
#-------------------------------------------------------------------------------------------------------------
# pstree	查看进程之间的关系
# netstat	查看当前网络连接

二. SSH 访问控制#

SSH 使用 TCP Wrappers 实现访问控制 # 注:做访问控制

主要配置文件

  • /etc/hosts.allow
  • /etc/hosts.deny

image-20220826172246758

TCP Wrappers 可以控制哪些服务

  • 受 super daemon(xinetd)管理的服务 # 注:守护进程的服务
  • 支持 libwrap.so 模块的服务

TCP Wrappers 的访问控制原则

  • 首先检查 hosts.allow 文件,若找到相匹配的策略,则允许访问

  • 否则继续检查 hosts.deny 文件,若找到相匹配的策略,则拒绝访问

  • 如果两个文件中都没有相匹配的策略,则允许访问

#注:守护进程层面的控制

image-20220826172422236

示例:/etc/hosts.deny
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A ~]# vim /etc/hosts.deny 
sshd:192.168.0.31	
# 注:访问控制,拒绝192.168.0.31 不需要重启服务,有守护进程帮它控制

#注:主机公钥在 /etc/ssh/ 下面 默认使用 ecdsa 模式

#注:known_hosts 文件里有什么 前面是 ip 地址,后面是公钥

#注:authorized_keys 放受信任的公钥


三. ssh 隧道#

#注:本地端口转发

CSDN https://www.cnblogs.com/keerya/p/7612715.html

端口转发:A、C、B 主机。主机 B 起了个 nginx 服务 端口号 80;主机 A 不能直接访问主机 B,但主机 A 可以访问主机 C,主机 C 可以访问主机 B (A-->C-->B);A 可以 ssh 到 C,A 跳到 C,然后访问 B 的 80 端口 (nginx)。现在 在主机 C 上面建立一个隧道,隧道开启 15577 端口连接 B 的 80 端口,A 去访问 15577 端口相当于去访问 B 的 80 映射

#注:ssh 隧道 第一个用于不能直接访问的情况;第二个考虑密文传输

[root@cPen_C ~]# lsof -i:15577			 	# 注:在C主机上操作,15577端口未被占用
[root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 sanchuang@192.168.0.39 -p 2233
#注:192.168.0.39 右边B主机ip地址			   # 注:在C主机上开通一个隧道 端口为15577
[root@cPen_A ~]# curl 192.168.0.48:15577	# 注:模仿网络访问 (80端口nginx网页使用curl访问)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">	# 注:返回的内容
#注:192.168.0.48 中间C主机ip地址				# 注:注意防火墙	iptables -F
#注:访问中间C主机的15577端口 转接成右边B主机的80端口
#注:注意 不能绑定到本地的回环地址 127.0.0.1	只能访问自己 (所以 -g) -g作用 本地所有ip都是访问
#注:- L是本地端口转发
#注:一般可以开启65535个端口

#总结:ssh 隧道

端口转发

1、关闭防火墙

2、关闭 selinux

#本地端口转发

# ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233 # 注:C 主机上执行 把 B 主机 80 端口映射本地 15577 端口*

B 主机 80 端口 B 主机

实验环境:

A 主机:192.168.0.132

C 主机:192.168.0.48

B 主机:192.168.0.39

在 C 主机上执行:[root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233

把 B 主机的 80 端口映射到本地的 15577 端口

访问 C 主机的 15577 端口就是访问 B 主机的 80 端口

#远程端口转发

# ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233 # 注:C 主机上 把 B 主机 80 端口 映射到 A 主机 15566 端口

B 主机 80 端口 A 主机

远程端口转发:在 C 主机上执行:[root@C .ssh]# ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233

把 B 主机的 80 端口映射到 A 主机的 15566 端口

访问 A 主机的 15566 就是访问 B 主机的 80

#注:A 主机 192.168.0.132

#注:B 主机 192.168.0.39

#注:在 C 主机上建立远程通道,在 C 主机上为 A 主机启动 15566 端口,映射到 B 主机

[root@cPen_A ~]# lsof -i:15566					# 注:A主机开启15566端口
sshd    2067 root    8u  IPv6  38604      0t0  TCP localhost:15566 (LISTEN)	# 注:监听的是本地回环地址
sshd    2067 root    9u  IPv4  38605      0t0  TCP localhost:15566 (LISTEN)
[root@cPen_A ~]# curl 127.0.0.1:15566			# 注:访问本地15566端口映射到B主机的80端口
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> # 返回的内容

四. ansible 服务#

ansible 是一个自动化运维工具的名称

基于 Python 开发,集合了众多运维工具的优点(puppet,fabric,slatstack),实现批量系统配置,程序的部署,批量运行命令等

.--------------------------------------------------------------------------------------------------------------------------------------------

Linux 运维:自动化(脚本),智能化,平台化

Linux 运维人员,人肉运维不可取

诞生了一系列的运维工具,ansible 就是其中之一

.--------------------------------------------------------------------------------------------------------------------------------------------

日常运维:

1、软件安装

2、服务的配置

3、运行脚本

4、升级

5、备份

.--------------------------------------------------------------------------------------------------------------------------------------------

ansible 基于 Python 开发,依赖于:paramiko,PyYaml 和 jinja 三个关键组件

基于 ssh 协议,只要…… 没写完

#其他服务需要部署 agent,而 ansible 只需要部署到 server,只要十万台的 key 都上传到其他机器上

#注:glibc 内核底层的库

.--------------------------------------------------------------------------------------------------------------------------------------------

#实验环境

a: 192.168.0.132(ansible)

c: 192.168.0.48

b: 192.168.0.39

实验前提,做好免密码认证,详见 ssh 服务

a --> b , a --> c a 可以免密码登录到 b 和 c

1、在 a 上安装 ansible

[root@cPen_A .ssh]# yum install epel-release # 注:安装 epel 源

[root@cPen_A .ssh]# yum install ansible # 注:安装 ansible

2、配置

配置目录:

/etc/ansible/ansible.cfg

ansible 的主配置文件,这个文件主要定义了 roles_path 路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改

/etc/ansible/hosts

这个配置文件就是默认的主机清单配置文件,可以通过 ansible.cfg 重新定义

备份 /etc/ansible/hosts 文件

编辑 /etc/ansible/hosts 文件

#将需要管理的主机添加到 webser 组

#如果通过 ssh 登录的端口不是 22 号端口,就需要在配置文件中指明端口号

[root@cPen_A ansible]# cp hosts{,.bak}	# 注:备份
[root@cPen_A ansible]# ls
ansible.cfg  hosts  hosts.bak  roles
[root@cPen_A ansible]# >hosts			# 注:老的清空
[root@cPen_A ansible]# vim hosts			
[webser]
192.168.0.31:2233
192.168.0.55

ansible 组成:

​ 1、host inventory --# 定义客户机,可以对客户机进行分类:db 类,web 类... 等等

​ 2、playbook --# 剧本 让主机按照我给定的剧本去完成一些事情

​ 3、module --# 模块 实现一个个功能的程序

​ 4、pluging --# 插件 实现一些额外的小功能

.--------------------------------------------------------------------------------------------------------------------------------------------

[root@cPen_A /]# cd /etc
[root@cPen_A etc]# ls |grep ansible
ansible
[root@cPen_A etc]# cd ansible
[root@cPen_A ansible]# ls
ansible.cfg  hosts  roles							# 注:host定义主机清单
[root@cPen_A ansible]# less ansible.cfg 
#inventory      = /etc/ansible/hosts				# 注:主机清单
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp
……
[root@cPen_A ansible]# less hosts 
## [webservers]						# 注:[中括号]里webservers 组名  对这个组进行访问控制
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

3、ansible使用
-m	指定模块名

HOST-PATTERN         	#匹配主机模式,如all表示所有主机
-m MOD_NAME          	#模块名   如:ping
-a MOD_ARGS         	#模块执行的参数
-f FORKS            	#生成几个子进行程执行
-C                   	#(不执行,模拟跑)
-u Username         	#某主机的用户名
-c  CONNection      	#连接方式(default smart)    

.--------------------------------------------------------------------------------------------------------------------------------------------

ansible 主执行程序,一般用于命令行下执行
ansible-playbook 执行 playbook 中的任务
ansible-doc 获取各模块的帮助信息

.--------------------------------------------------------------------------------------------------------------------------------------------

[root@cPen_A ~]# ansible -h					# 注:ansible -h帮助文档

#-------------------------------------------------------------------------
[root@cPen_A ~]# ansible
………………
ansible: error: too few arguments
[root@cPen_A ~]# which ansible
/usr/bin/ansible
[root@cPen_A ~]# ls -al /bin/ansible
lrwxrwxrwx 1 root root 20 11月 24 16:41 /bin/ansible -> /usr/bin/ansible-2.7
Ansible
[root@cPen_A ~]# ansible all -m shell -a "ip a"	# 注:匹配所有主机 使用shell模块 执行ip a
#注:指定ansible……没写完都执行命令
[root@cPen_A ~]# ansible all -m shell -a "mkdir /tmp/sc"
……
192.168.0.55 | CHANGED | rc=0 >>				# 注:返回0 执行执行成功
……
[root@cPen_A ~]# ansible webser -m shell -a "mkdir /tmp/sc"	# 注:匹配webser组
192.168.0.55 | FAILED | rc=1 >>					# 注:返回1 表示执行失败

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。