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
アクティブなインターネット接続 (サーバーと確立された接続)
Proto Recv-Q Send-Q ローカルアドレス           外部アドレス         状態       PID/プログラム名    
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
アクティブなインターネット接続 (サーバーと確立された接続)
Proto Recv-Q Send-Q ローカルアドレス           外部アドレス         状態       PID/プログラム名    
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
アクティブなインターネット接続 (サーバーと確立された接続)
Proto Recv-Q Send-Q ローカルアドレス           外部アドレス         状態       PID/プログラム名    
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 は C に ssh 接続し、C にジャンプして B の 80 ポート (nginx) にアクセスします。現在、ホスト C にトンネルを作成し、トンネルが 15577 ポートを開いて B の 80 ポートに接続します。A が 15577 ポートにアクセスすることは、B の 80 ポートにアクセスすることと同じです。

#注:ssh トンネルは、直接アクセスできない場合に使用されます;2 つ目は暗号化された転送を考慮します。

[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, saltstack)を集約し、バッチシステムの設定、プログラムのデプロイ、バッチコマンドの実行などを実現します

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

Linux 運用:自動化(スクリプト)、インテリジェント化、プラットフォーム化

Linux 運用担当者は、人力運用は避けるべきです

一連の運用ツールが誕生し、ansible はその一つです

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

日常運用:

1、ソフトウェアのインストール

2、サービスの設定

3、スクリプトの実行

4、アップグレード

5、バックアップ

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

ansible は Python で開発され、次の 3 つの重要なコンポーネントに依存しています:paramiko、PyYaml、jinja

ssh プロトコルに基づいており、…… 未完了

#他のサービスはエージェントをデプロイする必要がありますが、ansible はサーバーにデプロイするだけで、十万台のキーを他のマシンにアップロードするだけです

#注: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、ホストインベントリ --# クライアントを定義し、クライアントを分類できます:db クラス、web クラス... など

​ 2、プレイブック --# プレイブック ホストに私が指定したプレイブックに従って何かを完了させます

​ 3、モジュール --# モジュール 各機能を実現するプログラム

​ 4、プラグイン --# プラグイン 追加の小機能を実現します

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

[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							# 注:ホスト定義のインベントリ
[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      	#接続方式(デフォルトはsmart)    

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

ansible 主実行プログラム、通常はコマンドラインで実行されます
ansible-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は実行失敗を示します

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。