這是一個關於Linux 自動化運維的筆記簡志融111010501
建議弄一台新的虛擬機操作,比較容易成功
ls /boot
查看)
cd ~/linux-4.19.237/
、make menuconfig
[*]
: 表示將此功能編譯到 kernel 中,但體積會更大
<M>
: 將功能變成模組,在需要時將功能載入 kernel 中
[ ]
: 功能不會載到 kernel 中
reboot
二二八連假
一般的 SSH 使用帳號、密碼登入,除非密碼很強,不然其實容易被攻破
SSH CVEs : ssh 漏洞回報
Nmap
yum install nmap -y
nmap -sS -P0 -sV 192.168.56.0/24
Hydra (參考資料)
wget https://github.com/vanhauser-thc/thc-hydra/archive/master.zip
hydra -l user -p user 192.168.56.101 ssh
關閉密碼登入(只有無密碼可以登入)
[root@mycentos7-2 ~]# vim /etc/ssh/sshd_config
參考資料 : 動手寫 Linux Driver
寫核心時,如果程式出錯,會導致嚴重錯誤,所以要非常小心
不要把所有程式寫入核心,會讓核心運行負載太重,因此將程式模組化,需要時再載入核心,不須重新編譯
Linux 三劍客 : grep、sed、awk
sed,stream editor,會一行一行的讀指令
參考資料 : Linux 以 sed 指令搜尋、取代檔案內容教學與範例
、Linux 指令 SED 用法教學、取代範例、詳解
sed -e 's/word1/word2/g' input
-e : 結果只在螢幕顯示(檔案內容不變)
s : substitute,取代
g : gobal,匹配到的全換
sed -e 's/word1/word2/gi' input
gi : 不分大小寫
sed -i 's/word1/word2/gi' input
-i : 直接改寫檔案內容
sed -e 's/word1/word2/2' input
2 : 匹配到的第2個換(空白預設為1)
sed -e '3s/word1/word2/g' input
3s : 只在第3行執行
sed -e '1,3s/word1/word2/g' input
1,3s : 第1-3行執行
sed '1a HelloWorld' input
第一行之後插入
sed -e 's/word1/word2/2' -e 's/bbb/aaa/'input
兩種條件
很多指令也能用 -i
^# : 以#開頭
^$ : 空白行
/^ [] : 除了…
#開頭,word1結尾
.* : 匹配任意字元
\U : uper case,大寫
& : 原本的東西
全程在 user 下進行
rm -rf .ssh
mkdir -p .ssh
、chmod 700 .ssh
cat centos7-1.pub > authorized_keys
、chmod 600 authorized_keys
rm -rf .ssh
ssh-keygen -t rsa -b 4096
(路徑預設 Enter,密碼 123456)scp id_rsa.pub user@192.168.56.101:/home/user/.ssh/centos7-1.pub
ssh -i /home/user/.ssh/id_rsa user@192.168.56.101
WebDAV,Web-based Distributed Authoring and Versioning
將伺服器變成網路磁碟空間,參考資料 : 2/22 W3、Linux將WebDAV為本地磁盤
httpd -M | grep dav
mkdir /var/www/html/webdav
、cd /var/www/html/webdav
、touch {a..c}.txt
vim /etc/httpd/conf.d/webdav.conf
chmod -R 755 /var/www/html
、chown -R apache:apache /var/www/html
systemctl restart httpd
yum install -y davfs2
mkdir /cloud
、mount -t davfs http://192.168.56.101 /webdav
通配符(wildcard)用來匹配檔案名稱
正規表達式(Regular expression)用來匹配內容
ls a?
ls a*
ls a[1-9]
ls a[[:upper:]][[:upper:]]
ls a[^1-9]
-n : 標註行數
^ : 以…為開頭
$ : 以…為結尾
^r. : r 開頭,匹配任一字元
^r.. : r 開頭,匹配任二字元
^r.* : r 開頭,匹配 0-n 個字元 (* : 重複前面動作)
^ro* : 0-n 個 o 都可以
^r[opt] : ro、rp、rt
egrep : 擴充 grep
"10{1,}" : 10、100、1000、1000…,1 後面至少一個 0
? : 0-1 個
+ : 至少一個 (1-n)
| : or
IBM LinuxONE Community Cloud 免費試用申請教程
收不到email,改用Azure做
ssh azureuser@172.171.233.160
後來用學校的帳號收到信了 :)
用指令將公鑰複製到虛擬機桌面 : cp .ssh/id_rsa.pub .
用 Winscp 把檔案複製到 PC 桌面
在網站上創建虛擬機並加入公鑰
等待創建完成並連線
-B1 : 找到 AA,前面的兩行
-A1 : 找到 AA,之後一行
-A1 -B1 : 顯示前後各一行 (等於 -C1)
多重匹配
/aaa : 找aaa
/p : 印出來
-n : 不再印出全部內容
每行第一個 a/b 轉 A/B
寫成腳本帶入
"1itest" : 第一行 insert test
"2cHello" : 第二行 change Hello
由上往下讀取,舊的image 是 read only
新增、修改、刪除等…,都會在最上面新增一層,底下相同的內容會被覆蓋
一個 image 可有多個 container
本身沒有的軟體,沒安裝的伺服器或資料庫卻想使用,可抓容器直接使用
並可依本身需求客製化,產生新的鏡像,可快速轉移
Install Docker Engine on CentOS
rpm -qa | grep docker
systemctl start docker
docker run hello-world
docker hub
Docker commit 命令
操作 Docker 可用 CONTAINER ID(不需全打) 或 Name(需打全名)
docker ps -a
docker pa -a -q
docker rm hello-world
docker rmi d2c...
docker rm 'docker ps -a -q'
docker rm -f 'docker ps -a -q'
docker run -it --name=centos1 centos:centos7 /bin/bash
docker start 1e7...
exit
docker exec -it le7... /bin/bash
docker commit 1e7 centos:7.1
docker images
清明連假
一個Docker做一件事,否則升級擴容會變很大
dockerhub / mysql (期末IOT cloud db)
如果連不上,可先檢查
ifconfig
中 docker0 是否有 IP(172…)
沒有可重啟取得 IP 在連線
docker pull httpd
cd ~
mkdir testdocker
docker run -d -p 8088:80 centos7:web /usr/sbin/apachectl -DFOREGROUND
vim testweb.sh
將腳本設為可執行 : chmod +x testweb.sh
./testweb.sh
Grafana : Linux繪圖軟體 (期末可)
用預設的 docker0 橋接網路,docker 間只能用 IP 互聯
如果自己創造的橋接網路,docker 間通訊可以用 IP 或 Name互聯
docker network ls
docker network inspect ID
docker network create -d bridge mybr
docker run --name test1 --network mybr busybox /bin/sh
docker run --name test1 --network none busybox /bin/sh
docker run --name test1 --network host busybox /bin/sh
docker run --name test1 --network container busybox /bin/sh
docker save hello-world:latest > hello.tar
scp hello.tar user@192.168.56.101:/tmp
docker load < hello.tar
docker tag : 給鏡像別名 ; docker commit : 產生新的鏡像
前綴與用戶名稱一定要一樣
docker pull busybox
docker run -it --name test1 busybox /bin/sh
docker commit test1 ccjung/mybusybox:0.1
docker login
docker push ccjung/mybusybox:0.1
一般的應該所有伺服器顯示相同內容,此處為示範而不同
vim createweb.sh
chmod +x ./createweb.sh
、./createweb.sh
roundrobin : 第一個請求進來,給第一個,以此類推,輪流接受請求
vim haproxy.cfg
yum -y install haproxy
cp haproxy.cfg /etc/haproxy/haproxy.cfg
、systemctl start haproxy
一定要寫本機 IP
vim haproxy.cfg
systemctl stop haproxy
docker run -d -p 8080:8080 --name my-running-haproxy -v /root/test-docker/haproxy:/usr/local/etc/haproxy:ro haproxy
新系統會捨棄
ifconfig
,可改用ip addr show
查看
建兩個 network namespace : ip netns add container_ns1
、ip netns add container_ns2
查看配置 : ip netns exec container_ns1 ip addr show
一開始只有 lo (loopback)
增加一個橋接器 : brctl addbr mydocker0
給予IP : ip addr add 172.16.1.254/16 dev mydocker0
查看 : ip addr show mydocker0
啟動 : ip link set dev mydocker0 up
創建 VETH (Virtual Ethernet)
創建一對相連的網路卡,一張連 mydocker0,一張連 container_ns1
ip link add veth1 type veth peer name veth1p
ip link add veth2 type veth peer name veth2p
將一端連結到 mydocker0
brctl addif mydocker0 veth1
brctl addif mydocker0 veth2
將另一端連結到 container
ip link set veth1p netns container_ns1
ip link set veth2p netns container_ns2
將網卡改名
ip netns exec container_ns1 ip link set veth1p name eth0
ip netns exec container_ns2 ip link set veth2p name eth0
設定 IP 位置
ip netns exec container_ns1 ip addr add 172.16.1.1/16 dev eth0
ip netns exec container_ns2 ip addr add 172.16.1.2/16 dev eth0
ip netns exec container_ns1 ip link set eth0 up
ip netns exec container_ns2 ip link set eth0 up
ip netns exec container_ns1 ip route
ip netns exec container_ns2 ip route
可以做到數據持久化,關掉 docker 仍保有數據
參考 Docker 實戰系列(三):使用 Volume 保存容器內的數據
named volume : 先在 Linux host 'create' volume 再用
hosat volume : 直接對應現有的資料夾
創建 (named volume): docker volume create --name mydata
列出 : docker volume ls
執行對應 (所有docker都共享):
docker run -it --name test1 -v mydata:/mydata busybox sh
docker run -it --name test2 -v mydata:/mydata busybox sh
刪除 (docker未使用才能刪): docker volume rm mydata
多台機器一起提供網頁服務
DB 的埠號 3306,如果安裝過 mariadb,可先 stop,不然可能占用埠號
docker exec -it mydb bash
root/testdocker/php-code
,新增 test.php
交127.0.0.1:8080/test.php
NOT COMPLETE
CI/CD (Continuous Delivery/Continuous Deployment) 持續集成/持續部署
參考 Linux_note/109-1 Docker/W7-20201027.md
補充 Use CI/CD to build your application
python train_model.py
Flask 埠號 5000
pip install flask
vim server.py
vim client.py
docker pull nitincypher/docker-ubuntu-python-pip
vim Dockerfile
vim requirements.txt
docker build -t iris:1.0 .
docker run -itd --name iris -p 5000:5000 iris:1.0
需先註冊 GitLab 帳號
ssh-keygen
讓第二台機器扮演類似代理人的角色,只要 VM1 上傳檔案,VM2 會自動更新
在有更新時,另一台自動更新
成功
讓程式於背景執行,終端機關閉也不會終止
vim test.sh
chomd +x test.sh
nohup ./test.sh >log 2>&1 &
ps -ef | grep test
tail -f log
用於一台機器上,管理多個 docker 間的合作
1 v.s. 1
1 v.s. n
n v.s. n
在 test-docker/test-docker-compose/test1 下進行
vim docker-compose.yml
docker-compose up
docker-compose ps -a
docker-compose down
在 test-docker/test-docker-compose/test2 下進行
vim Dockerfile
vim docker-compose.yml
docker-compose build
docker images
docker-compose up -d
docker-compose log
docker-compose down
在 test-docker/test-docker-compose/test3 下進行
vim docker-compose.yml
cp ../test2/Dockerfile .
docker-compose up -d
docker-compose log -f
docker-compose down
在 test-docker/test-docker-compose/test5 下進行
水平擴容 : 相同的機器新增很多台
echo HelloWorld > index.html
vim Dockerfile
vim docker-compose.yml
docker-compose up -d --scale app=5
docker-compose ps
curl 127.0.0.1:30XX
docker-compose down
在 test-docker/test-docker-compose/test5 下進行
vim docker-compose.yml
docker-compose up -d
docker-compose exec -it app bash
docker-compose down
在 test-docker/test-docker-compose/test6 下進行
vim requirements.txt
vim Dockerfile
vim docker-compose.yml
vim app.py
docker-compose up -d
docker-compose ps
curl 127.0.0.1:5000
Jump server,管理帳號密碼、權限,稽核使用者動作
參考 2022/11/08 week10
遷移服務,讓機器出錯時也能服務
docker swarm init --advertise-addr 192.168.56.109
多在 manager 下操作
docker node ls
docker service create --name myweb httpd
docker service ls
docker service scale myweb=3
docker node update --availability drain centos7-1c1
docker node update --availability active centos7-1c1
docker service rm myweb
docker service update --publish-add 8081:80 myweb
docker pull redis:7.0
docker service create --replicas 3 --name redis redis:7.0
docker service update --image redis:7.2 redis
LLM (Large Language Model) : 大型語言模型
使用嵌入的資料(客製、隱私的資料),達成 AI 在地化
補充 github/eosphoros-ai/DB-GPT,專注於資料庫,用自然語言查詢資料庫
git clone https://github.com/n4ze3m/dialoqbase.git
cd dialoqbase/docker
vim .env
docker-compose up -d
docker-compose ps
192.168.56.101:3000
參考 : 建立 NFS Server,所有機器都先安裝 NFS
cd /
mkdir /mydb
、mkdir /myphp
vim /etc/exports
cd /
mkdir /mydb
、mkdir /myphp
mount -t nfs 192.168.56.109:/mydb /mydb
、mount -t nfs 192.168.56.109:/myphp /myphp
docker network create -d overlay mynet
docker network ls
docker exec -it bb1 bash
mysql -uroot -p
,創建 DB
cd /myphp
、vim test.php
curl 192.168.56.109:8888/test.php
OpenAI : ChatGPT
Google : Gemini
Meta : Llama 3
AWS : Anthropic (Claude)
HuggingFace : 人工智慧的開源社群
THUDM/chatglm3-6b
底層透過 SSH 操作其他機器
ansible server1 -m command -a ifconfig
ansible server1 -m shell -a "ifconfig > ifg.txt"
ssh-keygen
ssh-copy-id root@192.168.56.110
、ssh-copy-id root@192.168.56.111
vim /etc/hosts
yum install ansible
vim /etc/ansible/hosts
@/root/test-ansible/test1
vim test1.yml
ansible-playbook test1.yml
@/root/test-ansible/test2
vim test2.yml
ansible-playbook test2.yml
apt install openssh-server
vim /etc/ssh/sshd_config
systemctl restart ssh
ssh-copy-id root@192.168.56.112
vim /etc/hosts
scp /etc/hosts root@cubuntu22:/etc/hosts
vim /etc/ansible/hosts
ansible allservers -m ping
vim a.sh
chmod +x a.sh
ansible all -m script -a "./a.sh"
@root/test-ansible/test3
vim hi.j2
vim test3.yml
ansible-playbook test3.yml
、ansible server1 -m command -a "cat /tmp/hello_world.txt"
@root/test-ansible/test4
vim test4.yml
ansible-playbook test4.yml
centos >>> httpd
ubuntu >>> apache2
跳錯誤可能是 port 占用,可以留意一下
@root/test-ansible/test5
echo "Hi there" > hi.htm
cp /etc/httpd/conf/httpd.conf httpd.conf.j2
vim test5.yml
ansible-playbook test5.yml
範例一 : 運用 notify 跟 handlers,配置檔改變時,重啟服務
範例二 : 變數安裝 app (var in playbook)
範例三 : 變數安裝 app (從其他檔案引用 var )
範例四 : 群組變數
範例五 : 主機變數
範例六
shell: ps aux|grep httpd
: 查看行程是否跑起來
register: check_httpd
: 將輸出設成變數,並顯示結果
範例七 : jinja2版,使用 template 寫入配置檔
範例八 : 建立 memory cache,根據機器本身狀況配置空間大小
報告
Redis(Remote Dictionary Server)是一個高性能、NoSQL的記憶體鍵值儲存系統,使用 ANSI C 編寫的,適用於大多數POSIX系統,如Linux、MacOS等,主要用於作為資料庫、緩存和消息代理。若有短時間內大量存取的需求,卻又不想如此頻繁的對硬碟讀寫,這種場合可以使用 Redis 資料庫暫存資料,等一段時間後再一齊寫入硬碟裡。
Redis是單線程提供的鍵值存取的主要服務
但其他功能,如:持久化、異步刪除等需要額外線程完成。
scl enable devtoolset-9 bash
gcc --version
wget https://download.redis.io/releases/redis-6.0.10.tar.gz
tar xzf redis-6.0.10.tar.gz
cd redis-6.0.10
、make
src/redis-server
cd redis-6.0.10
、 src/redis-cli
src/redis-server --protected-mode no
mkdir redis
、cd redis
docker pull redis
docker ps
info
ping
shutdown
、quit
select n
dbsize
flushdb
flushall
move key n
keys *
exists key
set key value
type key
del key
expire key seconds
ttl key
persist key
renamex key1 key2
vim /etc/default/locale