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 | grep sshd
lsof -i:2233
cat /etc/services

[root@cPen_B ~]# netstat -anplut | grep 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 | grep 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 表示執行失敗

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。