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 表示执行失败

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.