[DevOps] 手把手帶您輕鬆管理 Windows 服務 (Windows Service) — 從建立到授權完整指南

在 Windows 環境下運行應用程式時,將其註冊為系統服務能大幅提升管理效率。
這篇文章將介紹 NSSM(Non-Sucking Service Manager)這個強大工具,
手把手教你如何快速建立 Windows 服務。
除了介紹 NSSM 與基礎的服務建立步驟,我們還會帶你瞭解 Windows 服務背後的權限原理,
探討如何安全地授予一般權限使用者開啟或關閉指定服務的權限,讓團隊協作更靈活,DevOps 流程更順暢。無論你是初學者或經驗豐富的系統管理員,這篇文章都能幫助你提升 Windows 服務管理的效率,讓你對 Windows 服務有更近一步的瞭解。

TL;DR

使用 NSSM (Non-Sucking Service Manager) 註冊服務
nssm 為了以後設定方便,使用指令來操作

假設我有一個 Windows 服務,名叫 MyService 你可以這麼做
(執行以下指令需使用 cmd 系統管理員權限)

nssm install "MyService" "C:\Java\bin\java.exe" "-jar C:\MyService\app.jar"
nssm set MyService AppDirectory "C:\MyService\"
nssm set MyService Description "This is my service"

每行指令說明:

  • 使用 nssm 註冊服務,用雙引號把所需要的參數括弧包起來
  • 設定程式起始路徑
  • 設定服務的說明

然後是最關鍵的調整權限:
(使用系統管理員的 Powershell 來執行)

Adjust-ServicePermissions.ps1 -Username myuser -ServiceName MyService

程式片段在此:
https://gist.github.com/j796160836/72346b43a315055caeebb69d7c3db76f

用法很簡單,就二個參數:

  • Username 帶入指定的使用者(一般使用者)的帳號名稱
  • ServiceName 帶入指定的 Windows 服務名稱

會給你對應的提示,按下 y 開始執行套用。

這邊已經把程式用 Script 包裝好了,帶入所需的參數即可。

接下來,我們來細講這些東西


nssm 服務管理器介紹與使用

nssm 當初的取名很有趣:Non-Sucking Service Manager
因為原作者覺得Windows 內建的 Windows 服務註冊工具實在都太難用了,
太爛、太 Suck 了!所以原作者想寫一個不難用的 (Non-Sucking) 服務管理器,故得名。

大部分的一般應用程式,都可以用 nssm 來註冊 Windows 服務。
nssm 他有 GUI 圖形介面,但為了以後設定方便,甚至做成 init scripts,建議還是使用指令來操作,以下也都是介紹指令。

你可以用以下的操作:

nssm 註冊安裝服務

假設你要單獨執行的指令 (測試指令) 如下:

C:\Java\bin\java.exe -jar C:\MyService\app.jar

註冊服務

欲把上述指令註冊成 Windows 服務,名字叫做 MyService
(這邊要用 cmd 系統管理員執行)

nssm install MyService "C:\Java\bin\java.exe" "-jar C:\MyService\app.jar"

要用雙引號把所需要的參數括弧包起來

設定服務起始路徑 (Startup Path)

設定程式起始路徑
(這邊要用 cmd 系統管理員執行)

nssm set MyService AppDirectory "C:\MyService\"

設定服務說明

設定 MyService 服務的說明
(這邊要用 cmd 系統管理員執行)

nssm set MyService Description "This is my service"

這二個指令都很直覺,就不細講了

移除服務

如果不小心弄錯了,可以用這個指令解除註冊
(這邊要用 cmd 系統管理員執行)

nssm remove MyService

實測只限於使用 nssm 註冊的服務


授予一般使用者開關指定服務的權限(手動步驟)

通常來說,Windows 服務只能管理員帳號 (Administrators)
才能做開關,但這樣權限實在太大了

基於「最小化權限原則」,我們能不能讓一般使用者,針對特定服務授予開啟與關閉的權限呢?

答案是可以的!但實在有點複雜…
我們先列出手動操作的步驟。

Step 1. 列出使用者的 sid

在 cmd 執行該指令,取得 sid

wmic useraccount where name='Tony' get sid

(假設你建立的一般使用者叫做 Tony)

記錄一下過程

wmic useraccount where name='Tony' get sid

SID
S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07

你就會得到類似這樣的 SID 先記下來備用

Step 2. 列出預設權限

先記下預設權限,這很重要 (以下呈現的結果供參考,以你實際的為主)

在 cmd 執行該指令,列出指定服務的權限

sc sdshow myService

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)

在 cmd 執行該指令,列出 Service Control Manager (SCM) 的權限

sc sdshow SCMANAGER

D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)

Step 3. 手工調整權限

主要觀念就是:
把預設的權限都留下,這些是系統管理員 (Administrator) 使用的。
我們手動再加上我們需要的權限

權限分為 D: 開頭的區域與 S: 開頭的區域,在拼組字串時要注意

我們把預設權限

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)

D: 開頭的區域,加上這段

(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)

這邊的 S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07 就是剛剛查的 sid
記得要保留 S: 開頭的區域

變成這樣

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

串上 sc sdset 指令,變成這樣
(這段需要系統管理員的命令提示字元 (cmd) 才能執行)

sc sdset myService D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

SCMANAGER 的部分也是如此

預設權限

D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)

D: 開頭的區域,加上這段

(A;;CCLCSWRPWPDTLOCRRC;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)

變成

D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CCLCSWRPWPDTLOCRRC;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)

最後串上 sc sdset 指令,並執行
(這段需要系統管理員的命令提示字元 (cmd) 才能執行)

sc sdset SCMANAGER D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)

Step 4. 驗證

使用 cmd 指令執行開啟服務,關閉服務

net start MyService
net stop MyService

或使用 PowerShell:

Start-Service -Name MyService
Stop-Service -Name MyService

應該都要能夠執行

再來使用 Ansible 來測試

playbook.yml

- name: Windows Service testing
  hosts: jenkins
  gather_facts: no
  tasks:
    - name: Stop service
      ansible.windows.win_service:
        name: MyService
        state: stopped
    - name: Start service
      ansible.windows.win_service:
        name: MyService
        start_mode: delayed
        state: started

inventory

[jenkins]
192.168.1.3 ansible_user=MY_USERNAME ansible_password='MY_PASSWORD' ansible_connection=winrm ansible_winrm_transport=basic ansible_winrm_server_cert_validation=ignore ansible_port=5985

執行 ansible playbook

export ANSIBLE_HOST_KEY_CHECKING=False && ansible-playbook -v -i inventory playbook.yml

授予一般使用者開關指定服務的權限(程式步驟)

剛剛以上很複雜的步驟,我已經幫你包成 Adjust-ServicePermissions.ps1 程式了
(使用系統管理員的 Powershell 來執行)

Adjust-ServicePermissions.ps1 -Username myuser -ServiceName MyService

程式片段在此:
https://gist.github.com/j796160836/72346b43a315055caeebb69d7c3db76f

用法二個參數:

  • Username 帶入指定的使用者(一般使用者)的帳號名稱
  • ServiceName 帶入指定的 Windows 服務名稱

會給你對應的提示,按下 y 開始執行套用。

如果有成功的話,恭喜你!與自動化更近一步!

Troubleshooting

補充一下,若執行 Powershell 遇到權限問題

PS C:\Users\user\Downloads> .\Adjust-ServicePermissions.ps1
.\Adjust-ServicePermissions.ps1 : C:\Users\user\Downloads\Adjust-ServicePermissions.ps1 檔案無法載入。檔案 C:\Users
\user\Downloads\Adjust-ServicePermissions.ps1 未經數位簽署。您無法在目前的系統上執行此指令碼。如需有關執行指令碼及
設定執行原則的詳細資訊,請參閱 about_Execution_Policies (網址為 http://go.microsoft.com/fwlink/?LinkID=135170)。
位於 線路:1 字元:1
+ .\Adjust-ServicePermissions.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

那你就在 Powershell 設定這個
(使用系統管理員的 Powershell 來執行)

Set-ExecutionPolicy RemoteSigned

SDDL (安全性描述元定義語言) 學習

這邊我們就深入探討一下 SDDL (Security Descriptor Definition Language, 安全性描述元定義語言) 與剛剛講的這些東西,若沒有要深入調整也沒關係,瞭解原理總是好的。
安全描述符 (Security Descriptor) 定義了服務的權限,包括了誰可以存取服務以及可以執行哪些操作。

SDDL 結構

SDDL 字串由兩個主要部分組成:

  1. DACL (Discretionary Access Control List):以 D: 開頭,定義了對象的存取控制條目 (ACE)。
  2. SACL (System Access Control List):以 S: 開頭,定義了審核條目。

DACL 部分

D: 開頭的字串表示 DAC (Discretionary Access Control List),後面是一組 ACE (Access Control Entries, 對象的存取控制條目),每個 ACE 定義了誰擁有什麼權限。

ACE 結構

每個 ACE 的結構如下:

(A;;<Permissions>;;;<SID>)
  • A:表示這是一個允許 (Allow) 的 ACE。
  • <Permissions>:定義授予的權限。
  • <SID>:定義授權的安全主體 (Security Identifier)。

分析自行建立的服務 (myService) 的權限

這是剛剛 sc sdshow myService 所出現的字串

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

分析 DACL (myService)

我們把 D: 開頭的部分拿出來

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)
  (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
  (A;;CCLCSWLOCRRC;;;IU)
  (A;;CCLCSWLOCRRC;;;SU)
  (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)
  1. (A;;CCLCSWRPWPDTLOCRRC;;;SY)

    • SY:表示 LocalSystem 帳戶。
    • CCLCSWRPWPDTLOCRRC:這是一組權限,分別代表:
      • CC:建立子項目(CREATE_CHILD)。
      • LC:列出子項目(LIST_CHILDREN)。
      • SW:寫入(SELF_WRITE)。
      • RP:讀取參數(READ_PROPERTY)。
      • WP:寫入參數(WRITE_PROPERTY)。
      • DT:刪除樹(DELETE_TREE)。
      • LO:列出項目(LIST_OBJECT)。
      • CR:控制存取(CONTROL_ACCESS)。
      • RC:讀取安全描述元(READ_CONTROL)。
    • 簡而言之:LocalSystem 帳戶擁有完全控制權限。
  2. (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)

    • BA:表示 Administrators 群組。
    • CCDCLCSWRPWPDTLOCRSDRCWDWO:這是一組更高級的權限,包含:
      • CC:建立子項目(CREATE_CHILD)。
      • DC:刪除子項目(DELETE_CHILD)。
      • LC:列出子項目(LIST_CHILDREN)。
      • SW:寫入(SELF_WRITE)。
      • RP:讀取參數(READ_PROPERTY)。
      • WP:寫入參數(WRITE_PROPERTY)。
      • DT:刪除樹(DELETE_TREE)。
      • LO:列出項目(LIST_OBJECT)。
      • CR:控制存取(CONTROL_ACCESS)。
      • SD:刪除(STANDARD_DELETE)。
      • RC:讀取安全描述元(READ_CONTROL)。
      • WD:修改存取控制清單(WRITE_DAC)。
      • WO:修改擁有者(WRITE_OWNER)。
    • 簡而言之:Administrators 群組擁有完全控制權限。
  3. (A;;CCLCSWLOCRRC;;;IU)

    • IU:表示互動使用者 (Interactive Users)。
    • CCLCSWLOCRRC:這是一組有限的權限,允許讀取和列舉操作。
      • CC:建立子項目(CREATE_CHILD)。
      • LC:列出子項目(LIST_CHILDREN)。
      • SW:寫入(SELF_WRITE)。
      • LO:列出項目(LIST_OBJECT)。
      • CR:控制存取(CONTROL_ACCESS)。
      • RC:讀取安全描述元(READ_CONTROL)。
    • 簡而言之:互動使用者擁有基本的讀取和列舉權限。
  4. (A;;CCLCSWLOCRRC;;;SU)

    • SU:表示服務使用者 (Service Users)。
    • CCLCSWLOCRRC:同上,與互動使用者相同的權限。
    • 簡而言之:服務使用者擁有基本的讀取和列舉權限。
  5. (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)

    • 這組是我們新增的權限
    • S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07:就是剛剛查詢的 sid。
    • CCDCLCSWRPWPDTLOCRSDRCWDWO:同 Administrators,就不贅述了。
    • 簡而言之:新增這個一般使用者,擁有完全控制權限,也是我們要達到的效果。

SACL 部分 (myService)

S: 表示 SACL (System Access Control List),定義了審核條目。

我們把 S: 開頭的部分拿出來

S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

SACL 結構

(AU;FA;<Permissions>;;;<SID>)
  • AU:表示審核條目 (Audit Entry)。
  • FA:表示完全瀏覽 (Full Access)。
  • <Permissions>:定義需要審核的權限。
  • <SID>:定義審核的對象。

分析 SACL

SACL 就相對沒那麼重要,不過還是帶一下

S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
  • AU:表示審核條目。
  • FA:表示完全瀏覽。
  • CCDCLCSWRPWPDTLOCRSDRCWDWO:定義了需要審核的權限,與 Administrators 的權限相同。
  • WD:表示 Everyone 群組。
  • 簡而言之:對 Everyone 群組的所有操作進行審核。

分析 SCMANAGER 的權限

接下來繼續看 sc sdshow SCMANAGER 命令顯示的安全描述符定義語言 (SDDL) 字串。

SCMANAGER 是服務控制管理器 (Service Control Manager)

D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)S:(AU;FA;KA;;;
WD)(AU;OIIOFA;GA;;;WD)

讓我們逐段分析這些字串。

DACL 部分 (SCMANAGER)

DACL 包含了多個瀏覽控制項 (ACE),每個項目用括號包圍:

D:(A;;CC;;;AU)
  (A;;CCLCRPRC;;;IU)
  (A;;CCLCRPRC;;;SU)
  (A;;CCLCRPWPRC;;;SY)
  (A;;KA;;;BA)
  (A;;CC;;;AC)
  (A;;CCLCSWRPWPRC;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)
  1. (A;;CC;;;AU)

    • A:允許 (Allow)
    • CC:建立子項目(CREATE_CHILD)權限
    • AU:已驗證的用戶 (Authenticated Users)
  2. (A;;CCLCRPRC;;;IU)

    • A:允許 (Allow)
    • CCLCRPRC:多個權限的組合:
      • CC:建立子項目(CREATE_CHILD)。
      • LC:列出子項目(LIST_CHILDREN)。
      • RP:讀取參數(READ_PROPERTY)。
      • RC:讀取安全描述元(READ_CONTROL)。
    • IU:互動式用戶 (Interactive Users)
  3. (A;;CCLCRPRC;;;SU)

    • A:允許 (Allow)
    • CCLCRPRC:同上
    • 適用於 SU:服務用戶 (Service Users)
  4. (A;;CCLCRPWPRC;;;SY)

    • A:允許 (Allow)
    • CCLCRPWPRC 同上並加上
      • WP:寫入參數(WRITE_PROPERTY)。
    • SY:系統 (System)
  5. (A;;KA;;;BA)

    • A:允許 (Allow)
    • KA:所有權限 (KEY_ALL_ACCESS)。
    • BA:內建管理員 (Built-in Administrators)
  6. (A;;CC;;;AC)

    • A:允許 (Allow)
    • CC:建立子項目(CREATE_CHILD)。
    • AC:所有應用程序包 (All Application Packages)
  7. (A;;CCLCSWRPWPRC;;;S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07)

    • 這組是我們新增的權限
    • A:允許 (Allow)
    • CCLCSWRPWPRC:這組權限為:
      • CC:建立子項目(CREATE_CHILD)。
      • LC:列出子項目(LIST_CHILDREN)。
      • SW:寫入(SELF_WRITE)。
      • RP:讀取參數(READ_PROPERTY)。
      • WP:寫入參數(WRITE_PROPERTY)。
      • RC:讀取安全描述元(READ_CONTROL)。
    • S-1-5-xx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xx07:就是剛剛查詢的 sid。

SACL 部分解析 (SCMANAGER)

S:(AU;FA;KA;;;WD)
  (AU;OIIOFA;GA;;;WD)

SACL 部分定義了審計規則:

  1. (AU;FA;KA;;;WD)

    • AU:審計 (Audit)
    • FA:AUDIT_FAILURE(失敗審計)
    • KA:KEY_ALL_ACCESS (所有權限)
    • WD:所有人 (Everyone)
  2. (AU;OIIOFA;GA;;;WD)

    • AU:審計
    • OIIOFA
      • OI:物件繼承 (OBJECT_INHERIT)。
      • IO:僅繼承(INHERIT_ONLY)。
      • FA:失敗審計 (AUDIT_FAILURE)。
    • GA:一般通用存取 (GENERIC_ALL)。
    • WD:所有人 (Everyone)

說明

這個安全描述符表明:

  • 管理員擁有完全控制權
  • 系統有廣泛的讀取、寫入和控制權限
  • 已認證用戶、交互式用戶和服務用戶有有限的瀏覽權限
  • 所有應用程式包可以建立子項目
  • 任何人嘗試完全瀏覽並失敗時會被記錄審計訊息

總結

這段 SDDL 字串的含義是:

  1. DACL
    • LocalSystem 帳戶擁有完全控制權限。
    • Administrators 群組擁有完全控制權限。
    • 互動使用者和服務使用者擁有基本的讀取和列舉權限。
  2. SACL
    • 對 Everyone 群組的所有操作進行審核。

這些設定用於控制服務的安全性,確保只有授權的使用者或群組可以執行特定操作,並記錄未經授權的瀏覽嘗試。

權限設定小結

myService 服務

  • 關鍵權限:
    • LocalSystem 和 Administrators:完全控制
    • 互動使用者和服務使用者:僅讀取和列舉
    • 特定使用者 (指定SID):完全控制
      -審核:追蹤所有使用者的操作嘗試

SCMANAGER 服務

  • 權限分層:
    • 管理員和系統:高級存取權限
    • 已驗證/互動/服務使用者:有限權限
    • 所有應用程式包:僅建立子項目
    • 特定使用者:自定義權限集
  • 審核:記錄失敗操作,含繼承規則

這種分層設計確保服務安全性,將完全控制權限限制在管理員和系統中,同時能為特定使用者提供自定義權限。

參考資料

後記:因為 SDDL 部份的參考資料有一點少,
有部分概念部分使用 AI 輔助,如有錯誤,還煩請不吝指正。

[DevOps/RPA] 使用 pyautogui 做自動化 automation

tags: pyautogui

用了一下 pyautogui 這個自動化套件,
覺得這個套件其實還蠻容易上手的,
你可以把它想成某種程式化的「按鍵精靈」
會照著你的想法去操作鍵盤、滑鼠。

在製作 RPA (Robotic Process Automation) 節省時間,增進效率,
會是一個非常關鍵要件

這邊帶你快速上手 pyautogui,算是我的某種 Cheat Sheet 吧

PyAutoGUI 介紹

PyAutoGUI 是一個用於 桌面自動化 的 Python 套件,能模擬滑鼠移動、點擊、拖曳,以及鍵盤輸入等操作。它跨平台支援 Windows、macOS、Linux,非常適合用來撰寫腳本自動完成重複性工作,例如批次截圖、測試 UI 或自動填表。PyAutoGUI 也提供螢幕截圖與簡易畫面影像辨識功能,能根據畫面上的元素定位與操作,讓自動化更靈活易用。

快速上手 pyautogui

鍵盤滑鼠類

列出我幾個常用的 method

按組合鍵

pyautoui.hotkey('win', 'r')

鍵盤上按指定按鍵

pyautogui.press('tab')

鍵盤打字

pyautogui.write('Hello, World.')

把滑鼠移過去點擊

pyautogui.click(100, 50, duration=0.5)

螢幕相關

找圖片上的位置(做定位點)

myAncher = pyautogui.locateOnScreen('button.png', grayscale=True)

螢幕截圖

pyautogui.screenshot('screenshot/1.png')

這邊你可以先螢幕截圖到時候讓程式來便是它

如果找不到圖片會噴 ImageNotFoundException

光這樣就可以玩很多花樣了

警告視窗系列

其他的部分它有簡單的提供一些 Alert, Confirm 的視窗

打開一個 Alert 警告窗

pyautogui.alert('This displays some text with an OK button.')

有時候提示使用者需要用到

取得視窗相關

取得所有視窗物件

pyautogui.getAllWindows()

取得所有視窗標題

pyautogui.getAllTitles()

它官網範例是操作 Windows 計算機
準備各按鈕截圖好的圖片,利用 locateOnScreen() 來定位
click() 來點擊操作計算機

基礎是這樣

參考資料

https://ithelp.ithome.com.tw/articles/10277668
https://pyautogui.readthedocs.io/en/latest/

[DevOps] 用 Ansible 來控制 IBM AIX

在現在的 Web 基礎架構中,自動化管理是提升維運效率的不可或缺的一環。透過 Ansible,企業能夠執行自動化部署、設定檔管理及例行維護,提高作業效率,減少人為錯誤,從而達成更高的系統穩定性和靈活性。嗯,到這裡你可能都聽過,也甚至使用過,畢竟每次談論 DevOps 都是在一些比較現代的 Linux 系統中實現。
那麼 IBM AIX 呢?IBM AIX 是基於 UNIX 的高效能作業系統,專為企業伺服器和關鍵任務設計。具備卓越的穩定性、安全性與可擴展性。就是因為他只讓開發者安裝必要的套件,所以穩定。😂
就讓我們來看看 IBM AIX 要如何串接 Ansible 達成自動化維運吧!

IBM AIX 做為目標機 (Managed node) 環境準備

因為 IBM AIX 於 1986 年推出,基於 UNIX System V 發展,擁有專屬管理工具,如 PowerVM。
Linux 於 1991 年推出,稱為 Unix-Like (類 UNIX) 系統,其開源性與靈活性在各領域廣泛應用。
AIX 的歷史發展是比 Linux 還要早的大型主機,跟 Linux 有不少的差異,
例如 AIX 預設是 KornShell (ksh) 而不是 bash。
所以執行指令上也需要注意

AIX 使用的 CPU 架構也不同,是 PowerPC(非 Apple 早期使用的 PowerPC),也不是 Linux 常用的 x86 架構,故很多編譯都要另外處理。

使用 ansible 的 ssh 指令雖然可以操作,但只能使用 ansible.builtin.raw 模組,
會有大多數的元件無法使用,所以我們需要安裝 python 3 來完整支援 ansible,等下會介紹到。

另外,如果你要使用到 ansible.posix.synchronize 這個模組,
因為 ansible.posix.synchronize 背後是使用 rsync 這個指令,這個指令在 AIX 上預設也是沒有安裝的,後面一步一步詳述。

註1:ansible 目標機 (Managed node) 最低要求需要一個 python
註2:歸功於 ansible.builtin.raw 模組,ansible 可以透過 ssh 來自動化操控網通設備

在 AIX 安裝 python

因為 AIX 本身沒有預裝套件管理程式,他有一個自己的套件程式叫做 installp
我找到 aixtools 這個網站,他有搜集各種 AIX 常用的套件,
而且是原生 *.I 的檔案,而不是一堆 rpm,
因為 AIX 本身也沒有類似 yum 的程式,光用 rpm 的安裝方式,它沒辦法幫我們處理一大堆 dependency 的問題,故目前可行的做法是還是用 installp 指令。
當然另外一條思路是安裝 dnf 這種套件管理程式,安裝較耗空間,這個就留給大家測試了。

下載來源:
http://www.aixtools.net/index.php/python3
(後期測試該網站壞掉,不過截稿時檔案還能下載,有需要的朋友請趕快留檔。)

檔案下載:
http://download.aixtools.net/tools/aixtools.python.py39.3.9.10.0.I

檔名:aixtools.python.py39.3.9.10.0.I

安裝指令

installp -acXd . aixtools.python.py39

(該指令需要 root 權限)

執行大概會像這樣

+-----------------------------------------------------------------------------+
                    Pre-installation Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...

SUCCESSES
---------
  Filesets listed in this section passed pre-installation verification
  and will be installed.

  Selected Filesets
  -----------------
  aixtools.python.py39.adt 3.9.10.0            # python py39 ADT files
  aixtools.python.py39.man.en_US 3.9.10.0      # python py39 man pages
  aixtools.python.py39.rte 3.9.10.0            # python py39 23-Feb-2022

  << End of Success Section >>

+-----------------------------------------------------------------------------+
                   BUILDDATE Verification ...
+-----------------------------------------------------------------------------+
Verifying build dates...done
FILESET STATISTICS
------------------
    3  Selected to be installed, of which:
        3  Passed pre-installation verification
  ----
    3  Total to be installed

+-----------------------------------------------------------------------------+
                         Installing Software...
+-----------------------------------------------------------------------------+

installp:  APPLYING software for:
        aixtools.python.py39.rte 3.9.10.0
        aixtools.python.py39.man.en_US 3.9.10.0
        aixtools.python.py39.adt 3.9.10.0

Finished processing all filesets.  (Total time:  32 secs).

+-----------------------------------------------------------------------------+
                                Summaries:
+-----------------------------------------------------------------------------+

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
aixtools.python.py39.rte    3.9.10.0         USR         APPLY       SUCCESS
aixtools.python.py39.man.en 3.9.10.0         USR         APPLY       SUCCESS
aixtools.python.py39.adt    3.9.10.0         USR         APPLY       SUCCESS

有看到 SUCCESS 就代表安裝成功了
這個套件預設會裝在 /opt/bin/python3.9

測試 python

跟之前一樣,我們可以嘗試印出 python 版本

/opt/bin/python3.9 --version

如果沒問題的話,會印出 python 版本

AIX 安裝 rsync

一樣是從 aixtools 下載

下載來源:
http://www.aixtools.net/index.php/rsync
(後期測試該網站壞掉,不過截稿時檔案還能下載,有需要的朋友請趕快留檔。)

檔案下載:
http://download.aixtools.net/tools/aixtools.samba.rsync.3.1.3.0.I

檔名: aixtools.samba.rsync.3.1.3.0.I

安裝指令

installp -acXvd . aixtools.samba.rsync

(該指令需要 root 權限)

執行大概會像這樣

+-----------------------------------------------------------------------------+
                    Pre-installation Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...

SUCCESSES
---------
  Filesets listed in this section passed pre-installation verification
  and will be installed.

  Selected Filesets
  -----------------
  aixtools.samba.rsync.man.en_US 3.1.3.0      # samba rsync man pages
  aixtools.samba.rsync.rte 3.1.3.0            # samba rsync 06-Feb-2020

  << End of Success Section >>

+-----------------------------------------------------------------------------+
                   BUILDDATE Verification ...
+-----------------------------------------------------------------------------+
Verifying build dates...done
FILESET STATISTICS
------------------
    2  Selected to be installed, of which:
        2  Passed pre-installation verification
  ----
    2  Total to be installed

+-----------------------------------------------------------------------------+
                         Installing Software...
+-----------------------------------------------------------------------------+

installp:  APPLYING software for:
        aixtools.samba.rsync.rte 3.1.3.0
        aixtools.samba.rsync.man.en_US 3.1.3.0

Finished processing all filesets.  (Total time:  1 secs).

+-----------------------------------------------------------------------------+
                                Summaries:
+-----------------------------------------------------------------------------+

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
aixtools.samba.rsync.rte    3.1.3.0         USR         APPLY       SUCCESS
aixtools.samba.rsync.man.en 3.1.3.0         USR         APPLY       SUCCESS

有看到 SUCCESS 就代表安裝成功了

預設會安裝路徑在 /opt/bin/rsync

測試 rsync

可以直接執行 /opt/bin/rsync 來測試是否安裝成功
成功會看到使用說明

AIX 安裝 OpenSSL 與 OpenSSH

後來發現,AIX 上面的 ssh 太舊,
新版的加密演算法與 ciphers 不支援,所以著手更新 ssh。
這段特別把 OpenSSL 與 OpenSSH 寫在一起,就是因為 OpenSSH 相依 OpenSSL,
所以要裝一個相配合的版本。

安裝 OpenSSL

這裡從 IBM 官網來下載

安裝文件
https://www.ibm.com/support/pages/downloading-and-installing-or-upgrading-openssl-and-openssh

下載來源
https://www.ibm.com/resources/mrs/assets?source=aixbp&S_PKG=openssl
(該網站需要登入,但帳號可以免費註冊,註冊後登入就可下載)

請根據你對應的 AIX 版本來選擇

這邊用
OpenSSL 1.1.1 for AIX 6.1, 7.1, 7.2 & 7.3
VRMF: 1.1.2.2400 (1.1.1x with no weak ciphers support)
做為範例

檔名:openssl-1.1.2.2400.tar.Z

首先我們把它解壓縮
(註:這邊雖然也是 tar 指令,但跟 Linux 的指令用法不同)

zcat openssl-1.1.2.2400.tar.Z | tar -xvf -

執行結果

x openssl-1.1.2.2400
x openssl-1.1.2.2400/openssl.base, 70546432 bytes, 137786 media blocks.
x openssl-1.1.2.2400/openssl.license, 31744 bytes, 62 media blocks.
x openssl-1.1.2.2400/openssl.man.en_US, 5326848 bytes, 10404 media blocks.

得到 openssl-1.1.2.2400 資料夾

我們切換資料夾,用 installp 來安裝

cd openssl-1.1.2.2400
installp -qaXFY -d . openssl.base openssl.license openssl.man.en_US

執行結果

+-----------------------------------------------------------------------------+
                    Pre-installation Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...

SUCCESSES
---------
  Filesets listed in this section passed pre-installation verification
  and will be installed.

  Selected Filesets
  -----------------
  openssl.base 1.1.2.2400                     # Open Secure Socket Layer
  openssl.license 1.1.2.2400                  # Open Secure Socket License
  openssl.man.en_US 1.1.2.2400                # Open Secure Socket Layer

  << End of Success Section >>

+-----------------------------------------------------------------------------+
                   BUILDDATE Verification ...
+-----------------------------------------------------------------------------+
Verifying build dates...done
FILESET STATISTICS
------------------
    3  Selected to be installed, of which:
        3  Passed pre-installation verification
  ----
    3  Total to be installed

+-----------------------------------------------------------------------------+
                         Installing Software...
+-----------------------------------------------------------------------------+

installp:  APPLYING software for:
        openssl.man.en_US 1.1.2.2400

. . . . . << Copyright notice for openssl.man.en_US >> . . . . . . .
 Licensed Materials - Property of IBM

 5765G6281
   Copyright International Business Machines Corp. 2011, 2024.

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssl.man.en_US >>. . . .

Filesets processed:  1 of 3  (Total time:  32 secs).

installp:  APPLYING software for:
        openssl.license 1.1.2.2400

. . . . . << Copyright notice for openssl.license >> . . . . . . .
 Licensed Materials - Property of IBM

 5765G6281
   Copyright International Business Machines Corp. 2011, 2024.

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssl.license >>. . . .

Filesets processed:  2 of 3  (Total time:  32 secs).

installp:  APPLYING software for:
        openssl.base 1.1.2.2400

. . . . . << Copyright notice for openssl.base >> . . . . . . .
 Licensed Materials - Property of IBM

 5765G6281
   Copyright International Business Machines Corp. 2011, 2024.
   Copyright Baltimore Technologies Ltd. 2004.
   Copyright KISA (Korea Information Security Agency), 2007.
   Copyright Ben Laurie ([email protected]), 2008.
   Copyright Richard Levitte <[email protected]), 2004.
   Copyright The OpenSSL Project. 1998-2008
   Copyright The OpenTSA Project. 2002
   Copyright Andy Polyakov <[email protected]>, 2008
   Copyright Sun Microsystems, Inc. 2002.

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssl.base >>. . . .

Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
Finished processing all filesets.  (Total time:  40 secs).

+-----------------------------------------------------------------------------+
                                Summaries:
+-----------------------------------------------------------------------------+

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
openssl.man.en_US           1.1.2.2400      USR         APPLY       SUCCESS
openssl.license             1.1.2.2400      USR         APPLY       SUCCESS
openssl.base                1.1.2.2400      USR         APPLY       SUCCESS
openssl.base                1.1.2.2400      ROOT        APPLY       SUCCESS

接下來接續安裝 OpenSSH

安裝 OpenSSH

一樣是從 IBM 網站下載

下載位置
https://www.ibm.com/resources/mrs/assets?source=aixbp&S_PKG=openssh
(該網站需要登入,但帳號可以免費註冊,註冊後登入就可下載)

找到跟 OpenSSL 對應的版本
OpenSSH 9.2 (compiled with Openssl 1.1.2)
VRMF: 9.2.112.2400
來下載

檔名:OpenSSH_9.2.112.2400.tar.Z

一樣用 tar 指令解壓縮

zcat OpenSSH_9.2.112.2400.tar.Z | tar -xvf -

(註:這邊雖然也是 tar 指令,但跟 Linux 的指令用法不同)

得到 OpenSSH_9.2.112.2400 資料夾

安裝

cd OpenSSH_9.2.112.2400
installp -qaXFY -d . openssh.base openssh.license openssh.man.en_US openssh.msg.en_US

記錄一下執行結果

+-----------------------------------------------------------------------------+
                    Pre-installation Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...

SUCCESSES
---------
  Filesets listed in this section passed pre-installation verification
  and will be installed.

  Selected Filesets
  -----------------
  openssh.base.client 9.2.112.2400            # Open Secure Shell Commands
  openssh.base.server 9.2.112.2400            # Open Secure Shell Server
  openssh.license 9.2.112.2400                # Open Secure Shell License
  openssh.man.en_US 9.2.112.2400              # Open Secure Shell Documentat...
  openssh.msg.en_US 9.2.112.2400              # Open Secure Shell Messages -...

  << End of Success Section >>

+-----------------------------------------------------------------------------+
                   BUILDDATE Verification ...
+-----------------------------------------------------------------------------+
Verifying build dates...done
FILESET STATISTICS
------------------
    5  Selected to be installed, of which:
        5  Passed pre-installation verification
  ----
    5  Total to be installed

+-----------------------------------------------------------------------------+
                         Installing Software...
+-----------------------------------------------------------------------------+

installp:  APPLYING software for:
        openssh.license 9.2.112.2400

. . . . . << Copyright notice for openssh.license >> . . . . . . .
 Licensed Materials - Property of IBM

 5765E6111
   Copyright International Business Machines Corp. 2001, 2024.

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssh.license >>. . . .

Filesets processed:  1 of 5  (Total time:  1 secs).

installp:  APPLYING software for:
        openssh.base.server 9.2.112.2400
        openssh.base.client 9.2.112.2400

. . . . . << Copyright notice for openssh.base >> . . . . . . .
 Licensed Materials - Property of IBM

 5765E6111
   Copyright International Business Machines Corp. 2011, 2024.
   Copyright Per Allansson, 2001.
   Copyright AppGate Network Security AB, 2004-2009.
   Copyright Gary S. Brown, 1986.
   Copyright The Regents of the University of California, 1983, 1990, 1992, 1993, 1995.
   Copyright Aaron Campbell. 1999
   Copyright CORE SDI S.A., Buenos Aires, Argentina. 1998
   Copyright Gert Doering, 2001.
   Copyright Jason Downs, 1996.
   Copyright Markus Friedl. 1999, 2000, 2001, 2002
   Copyright Free Software Foundation, Inc., 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002.
   Copyright Dr Brian Gladman <[email protected]>, Worcester, UK, 2001
   Copyright g10 Code GmbH, 2006, 2007.
   Copyright Wesley Griffin, 2003.
   Copyright Andreas Jellinghaus, 2006.
   Copyright Daniel Kouril, 2002.
   Copyright Ben Lindstrom, 2000, 2001, 2003.
   Copyright Andre Lucas, 2000.
   Copyright David Mazieres <[email protected]>  1995, 1996
   Copyright Damien Miller. 1999-2003
   Copyright Massachusetts Institute of Technology, 1987 - 2001.
   Copyright The NetBSD Foundation, Inc., 1997, 1998.
   Copyright Nils Nordman, 2002.
   Copyright The OpenBSD project, 2004.
   Copyright Niels Provos. 1995
   Copyright Theo de Raadt. 1999
   Copyright Tim Rice, 2002.
   Copyright Jakob Schlyter, 2003.
   Copyright Dug Song. 1995
   Copyright Kevin Steves. 1995
   Copyright Peter Stuge <[email protected]>, 2003
   Copyright Todd C. Miller, 1998.
   Copyright Darren Tucker 2004.
   Copyright Simon Wilkinson, 2001, 2003.
   Copyright Tatu Ylonen <[email protected]>, Espoo, Finland, 1995

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.

 Licensed Materials - Property of IBM

 5765E6111
   Copyright International Business Machines Corp. 2011, 2024.
   Copyright Per Allansson, 2001.
   Copyright Gary S. Brown, 1986.
   Copyright The Regents of the University of California, 1983, 1990, 1992, 1993, 1995.
   Copyright Aaron Campbell. 1999
   Copyright CORE SDI S.A., Buenos Aires, Argentina. 1998
   Copyright Gert Doering, 2001.
   Copyright Jason Downs, 1996.
   Copyright Markus Friedl. 1999, 2000, 2001, 2002
   Copyright Free Software Foundation, Inc., 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002.
   Copyright Dr Brian Gladman <[email protected]>, Worcester, UK, 2001
   Copyright Wesley Griffin, 2003.
   Copyright Daniel Kouril, 2002.
   Copyright Ben Lindstrom, 2000, 2001, 2003.
   Copyright Andre Lucas, 2000.
   Copyright David Mazieres <[email protected]>  1995, 1996
   Copyright Damien Miller. 1999-2003
   Copyright Massachusetts Institute of Technology, 1987 - 2001.
   Copyright Nils Nordman, 2002.
   Copyright The OpenBSD project, 2004.
   Copyright Niels Provos. 1995
   Copyright Theo de Raadt. 1999
   Copyright Tim Rice, 2002.
   Copyright Jakob Schlyter, 2003.
   Copyright Dug Song. 1995
   Copyright Kevin Steves. 1995
   Copyright Peter Stuge <[email protected]>, 2003
   Copyright Todd C. Miller, 1998.
   Copyright Darren Tucker 2004.
   Copyright Simon Wilkinson, 2001, 2003.
   Copyright Tatu Ylonen <[email protected]>, Espoo, Finland, 1995

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssh.base >>. . . .

Generating rsa key...
Generating dsa key...
Generating ecdsa key...
Generating ed25519 key...
Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
0513-071 The sshd Subsystem has been added.
0513-004 The Subsystem or Group, ssh, is currently inoperative.
0513-059 The sshd Subsystem has been started. Subsystem PID is 22413564.
Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
Successfully updated the Kernel Authorization Table.
Successfully updated the Kernel Role Table.
Successfully updated the Kernel Command Table.
Successfully updated the Kernel Device Table.
Successfully updated the Kernel Object Domain Table.
Successfully updated the Kernel Domains Table.
Filesets processed:  3 of 5  (Total time:  7 secs).

installp:  APPLYING software for:
        openssh.msg.en_US 9.2.112.2400

. . . . . << Copyright notice for openssh.msg.en_US >> . . . . . . .
 Licensed Materials - Property of IBM

 5765E6111
   Copyright International Business Machines Corp. 2011, 2024.

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssh.msg.en_US >>. . . .

Filesets processed:  4 of 5  (Total time:  7 secs).

installp:  APPLYING software for:
        openssh.man.en_US 9.2.112.2400

. . . . . << Copyright notice for openssh.man.en_US >> . . . . . . .
 Licensed Materials - Property of IBM

 5765E6111
   Copyright International Business Machines Corp. 2011, 2024.
   Copyright Aaron Campbell. 1999
   Copyright Markus Friedl. 1999, 2000, 2001, 2002
   Copyright David Mazieres <[email protected]>  1995, 1996
   Copyright Damien Miller. 2001, 2002
   Copyright Theo de Raadt. 1999
   Copyright Tatu Ylonen <[email protected]>, Espoo, Finland, 1995

 All rights reserved.
 US Government Users Restricted Rights - Use, duplication or disclosure
 restricted by GSA ADP Schedule Contract with IBM Corp.
. . . . . << End of copyright notice for openssh.man.en_US >>. . . .

Finished processing all filesets.  (Total time:  8 secs).

+-----------------------------------------------------------------------------+
                                Summaries:
+-----------------------------------------------------------------------------+

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
openssh.license             9.2.112.2400    USR         APPLY       SUCCESS
openssh.base.server         9.2.112.2400    USR         APPLY       SUCCESS
openssh.base.client         9.2.112.2400    USR         APPLY       SUCCESS
openssh.base.server         9.2.112.2400    ROOT        APPLY       SUCCESS
openssh.base.client         9.2.112.2400    ROOT        APPLY       SUCCESS
openssh.msg.en_US           9.2.112.2400    USR         APPLY       SUCCESS
openssh.man.en_US           9.2.112.2400    USR         APPLY       SUCCESS

測試 OpenSSH

我們用以下指令來測試 sshd 服務

/usr/sbin/sshd -d -e

取得 sshd 的狀態

lssrc -s sshd

如有必要,重啟 sshd 服務

stopsrc -s sshd;startsrc -s sshd

安裝 Bash

恩對,你沒看錯 bash 也是可以另外裝的
一樣從 aixtools 網站下載

下載來源
http://www.aixtools.net/index.php/bash
(後期測試該網站壞掉,不過截稿時檔案還能下載,有需要的朋友請趕快留檔。)

檔案
http://download.aixtools.net/tools/gnu/aixtools.gnu.bash.5.0.18.0.I

檔名:aixtools.gnu.bash.5.0.18.0.I

安裝指令

installp -acXvd . aixtools.gnu.bash

記錄一下執行結果

+-----------------------------------------------------------------------------+
                    Pre-installation Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...

SUCCESSES
---------
  Filesets listed in this section passed pre-installation verification
  and will be installed.

  Selected Filesets
  -----------------
  aixtools.gnu.bash.man.en_US 5.0.18.0        # gnu bash man pages
  aixtools.gnu.bash.rte 5.0.18.0              # gnu bash 15-Oct-2020
  aixtools.gnu.bash.share 5.0.18.0            # gnu bash universal files

  << End of Success Section >>

+-----------------------------------------------------------------------------+
                   BUILDDATE Verification ...
+-----------------------------------------------------------------------------+
Verifying build dates...done
FILESET STATISTICS
------------------
    3  Selected to be installed, of which:
        3  Passed pre-installation verification
  ----
    3  Total to be installed

+-----------------------------------------------------------------------------+
                         Installing Software...
+-----------------------------------------------------------------------------+

installp:  APPLYING software for:
        aixtools.gnu.bash.share 5.0.18.0
        aixtools.gnu.bash.rte 5.0.18.0
        aixtools.gnu.bash.man.en_US 5.0.18.0

Finished processing all filesets.  (Total time:  1 secs).

+-----------------------------------------------------------------------------+
                                Summaries:
+-----------------------------------------------------------------------------+

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
aixtools.gnu.bash.share     5.0.18.0        USR         APPLY       SUCCESS
aixtools.gnu.bash.rte       5.0.18.0        USR         APPLY       SUCCESS
aixtools.gnu.bash.man.en_US 5.0.18.0        USR         APPLY       SUCCESS

如找不到 bash 可以用以下指令尋找

find / -name bash 2>/dev/null

這樣我們就萬事具備了

撰寫 ansible playbook 腳本

設定完成後,終於可以來寫 ansible playbook 了

這邊給一個範例,印出 oslevel,查看系統版本
在 Control node 這邊建立 playbook.ymlinventory 二個檔案

playbook.yml

- name: print os version
  hosts: aix
  gather_facts: no
  tasks:
    - name: print os version
      ansible.builtin.command: "oslevel"
      register: out
    - name: output
      ansible.builtin.debug:
        msg: 
          - "{{ out.stdout_lines }}"

inventory

[aix]
192.168.1.2 ansible_user=myuser ansible_ssh_private_key_file=./server_key ansible_connection=ssh ansible_port=22 ansible_python_interpreter=/opt/bin/python3.9     

這邊假設 AIX 的主機是 192.168.1.2 你可以改成你的主機

然後執行 ansible playbook

export ANSIBLE_HOST_KEY_CHECKING=False && \
ansible-playbook -vvv -i inventory playbook.yml'

解釋一下指令,因為 python 不是預設安裝路徑,需給定 python 路徑,這是重點之一。

ansible_python_interpreter=/opt/bin/python3.9

這邊提供其他範例,這個是利用 ansible.posix.synchronize 模組來複製檔案

- name: copy files
  hosts: aix
  gather_facts: no
  tasks:
    - name: copy files
      ansible.posix.synchronize:
        src: /local/dir
        dest: /remote/dir
        recursive: true
        checksum: true
        rsync_path: /opt/bin/rsync
        rsync_opts:
        - "--no-motd"
        - "--exclude=.git"

這邊一樣因為 rsync 不是預設路徑,使用 rsync_path 參數來指定遠端 rsync 的路徑

rsync_path: /opt/bin/rsync

這邊有特別忽略 .git 資料夾,避免不該傳上去的檔案傳上去,
其他做法就跟使用 linux 差不多了

ansible 模組的差異

這邊列出一些常用的 ansible 指令

  • ansible.builtin.command
  • ansible.builtin.shell
  • ansible.builtin.copy
  • ansible.posix.synchronize

根據官方文件,
ansible.builtin.command 預設會過濾一些特殊字元(例如:大於、小於、星號…等),較安全
如果有特殊符號需求,請改用 ansible.builtin.shell

ansible.builtin.copyansible.posix.synchronize 雖然都是複製檔案,但也有點不同。
ansible.builtin.copy 是基於 scp 指令來實作的,它是一個一個檔案複製(包含 checksum)
ansible.posix.synchronize 是基於 rsync 指令來實作的,因為連線有壓縮,複製速度較快

同樣複製多層資料夾,約 500MB 的檔案,實際使用差異可以到 3 小時的差別。

祝設定愉快