Ansible 致力於簡化系統管理流程,本文將引導你完成在 Windows 和 Linux 系統上使用 Ansible 的必要設定。首先,針對 Windows 系統,我們會詳細說明如何啟用和設定 WinRM 服務,這對於 Ansible 與 Windows 主機通訊至關重要。同時,也會提供 PowerShell 指令碼來簡化 hotfix 安裝流程,並示範如何使用 winrm 命令驗證設定。對於 Linux 系統,我們將說明 Ansible 如何利用 SSH 進行連線,如何設定 inventory 檔案,以及如何使用 ad-hoc 命令執行基本操作,例如 ping 測試、收集系統資訊、檔案管理和軟體套件安裝。這些步驟將幫助你快速上手 Ansible,並開始自動化你的日常工作。
組態 Windows 主機以配合 Ansible 使用
在開始使用 Ansible 管理 Windows 主機之前,需要進行一些必要的組態。首先,必須確保 Windows 主機上的 WinRM 服務已啟用並正確組態。
檢查 PowerShell 版本與 WinRM 服務
首先,請確認 Windows 主機上的 PowerShell 版本。對於 PowerShell v3.0,可能會遇到 WinRM 服務的記憶體限制問題。幸運的是,這是一個已知問題,並且有可用的 hotfix 來解決它。以下是一個範例 PowerShell 指令碼,用於下載並安裝此 hotfix:
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1"
$file = "$env:temp\Install-WMF3Hotfix.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file -Verbose
內容解密:
- 下載指令碼:使用
System.Net.WebClient下載 hotfix 安裝指令碼。 - 執行指令碼:以
-ExecutionPolicy ByPass引數執行下載的指令碼,以避免執行策略限制。 - 輸出詳細資訊:使用
-Verbose引數輸出詳細的執行過程。
組態 WinRM 監聽器
組態 WinRM 監聽器可能是一個複雜的任務,因此檢查組態結果非常重要。使用以下命令可以顯示目前的 WinRM 監聽器組態:
winrm enumerate winrm/config/Listener
內容解密:
winrm enumerate命令:用於列舉 WinRM 組態中的監聽器設定。- 輸出結果:顯示目前活躍的監聽器,包括其傳輸協定、埠號、主機名稱等資訊。
成功的輸出應該類別似於:
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7
Listener
Address = *
Transport = HTTPS
Port = 5986
Hostname = SERVER2016
Enabled = true
URLPrefix = wsman
CertificateThumbprint = E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE
ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7
除錯 WinRM 連線問題
如果需要除錯連線問題,可以使用以下命令測試 WinRM 連線:
# 測試 HTTP 連線
winrs -r:http://<server address>:5985/wsman -u:Username -p:Password ipconfig
# 測試 HTTPS 連線(如果證書不可驗證,將失敗)
winrs -r:https://<server address>:5986/wsman -u:Username -p:Password -ssl ipconfig
# 測試 HTTPS 連線,忽略證書驗證
$username = "Username"
$password = ConvertTo-SecureString -String "Password" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password
$session_option = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Invoke-Command -ComputerName server -UseSSL -ScriptBlock { ipconfig } -Credential $cred -SessionOption $session_option
內容解密:
winrs命令:用於測試 WinRM 連線。Invoke-Commandcmdlet:用於在遠端電腦上執行命令。New-PSSessionOptioncmdlet:用於建立 PSSessionOption 物件,以指定連線選項。
在 Ansible 控制主機上組態 Windows 主機
安裝
winrmPython 模組:使用pip安裝winrm模組。$ pip install winrm定義 inventory 變數:在 Ansible 的 inventory 檔案中定義 Windows 主機的相關變數。
[windows] 192.168.1.52 [windows:vars] ansible_user=administrator ansible_password=password ansible_connection=winrm ansible_winrm_server_cert_validation=ignore執行 Ansible ping 模組:測試與 Windows 主機的連線。
$ ansible -i inventory -m ping windows成功輸出的範例如下:
192.168.1.52 | SUCCESS => { "changed": false, "ping": "pong" }
Ansible 入門:理解 Ansible 如何連線到主機
Ansible 是一種強大的自動化工具,主要用於管理和組態伺服器。它透過 SSH 協定與主機進行通訊,這使得 Ansible 成為一個無需在目標主機上安裝代理程式(agentless)的解決方案。本文將探討 Ansible 如何連線到主機,以及如何驗證 Ansible 的安裝。
Ansible 如何連線到主機
除了 Windows 主機外,Ansible 使用 SSH 協定與主機進行通訊。這是因為幾乎所有的 Linux、FreeBSD 和 macOS 主機都內建了 SSH 服務,而且許多網路裝置如交換器和路由器也支援 SSH。SSH 服務通常與作業系統的身份驗證堆積疊整合,這使得你可以利用 Kerberos 等技術來提高身份驗證的安全性。此外,OpenSSH 的 ControlPersist 功能被用來提高自動化任務的效能,以及使用 SSH 跳轉主機來實作網路隔離和安全。
使用 SSH 金鑰進行身份驗證
Ansible 使用與你已經熟悉的相同的身份驗證方法。SSH 金鑰通常是最簡單的方式,因為它們消除了每次執行 playbook 時輸入身份驗證密碼的需要。不過,這並不是強制性的,Ansible 也支援透過 --ask-pass 開關使用密碼身份驗證。如果您連線到主機上的非特權帳戶,並且需要執行類別似於在 sudo 下執行命令的操作,您也可以在執行 playbook 時新增 --ask-become-pass 來允許在執行時指定密碼。
# 使用 SSH 金鑰進行身份驗證
$ ansible webservers -m ping --private-key=~/.ssh/id_rsa
#### 內容解密:
此命令使用 Ansible 的 ping 模組測試與 webservers 群組中主機的連線。--private-key 選項指定了用於身份驗證的 SSH 私鑰檔案。
清單(Inventory)格式
Ansible 的自動化任務是針對清單中的主機執行的。清單是一個簡單的主機列表,你希望對這些主機執行自動化命令。Ansible 支援多種清單格式,包括動態清單,它可以從協調提供者那裡自動填充。例如,你可以從 Amazon EC2 例項動態生成 Ansible 清單,這樣你就不必跟上雲端基礎設施中的所有變化。
INI 格式的清單範例
[webservers]
web1.example.com
web2.example.com
[apservers]
ap1.example.com
ap2.example.com
#### 內容解密:
此清單將四台伺服器分成兩個群組:webservers 和 apservers。Ansible 命令和 playbook 可以針對整個清單、一個或多個群組,甚至是單個伺服器執行。
使用 Ansible ping 模組測試連線
$ ansible webservers -m ping
web1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
web2.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
#### 內容解密:
此命令使用 ping 模組測試與 webservers 群組中主機的連線。輸出顯示兩台主機都成功回應了 ping 請求。
驗證 Ansible 安裝
在這一部分,我們將學習如何使用簡單的 ad hoc 命令驗證 Ansible 的安裝。假設你已經生成了公鑰和私鑰對,並將公鑰應用到所有目標主機上。
使用 ssh-copy-id 分發公鑰
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected]
#### 內容解密:
此命令使用 ssh-copy-id 實用程式將你的公鑰分發到目標主機 web1.example.com。這使得你可以使用 SSH 金鑰進行無密碼登入。
Ansible 入門:基礎設定與 Ad Hoc 命令操作
Ansible 是一款強大的自動化工具,用於簡化 IT 任務的執行和管理。在本章中,我們將探討如何設定 Ansible 環境、執行 ad hoc 命令以及瞭解受管節點的需求。
使用 SSH-Agent 進行身份驗證
為了確保 Ansible 能夠使用私鑰進行身份驗證,我們可以使用 ssh-agent。以下是啟動 ssh-agent 並新增私鑰的範例:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
請記得將路徑替換為您自己的私鑰位置。
定義 Inventory
如同前一節所述,我們需要定義一個 inventory 讓 Ansible 執行。以下是一個簡單的範例:
[frontends]
frt01.example.com
frt02.example.com
Ad Hoc 命令操作
ansible 命令有兩個重要的引數:-m <MODULE_NAME> 用於在指定的主機上執行模組,-a OPT_ARGS 用於傳遞模組引數。使用 ansible 命令執行的命令稱為 ad hoc 命令。
以下是三個簡單的 ad hoc 命令範例,用於驗證 Ansible 安裝和目標主機組態:
- Ping 主機:使用以下命令對 inventory 主機進行 Ansible “ping”:
$ ansible frontends -i hosts -m ping - 顯示收集的事實:使用以下命令顯示 inventory 主機的事實:
$ ansible frontends -i hosts -m setup | less - 過濾收集的事實:使用以下命令過濾 inventory 主機的事實:
$ ansible frontends -i hosts -m setup -a "filter=ansible_distribution*"
執行結果範例
執行 ping 模組的結果如下:
$ ansible frontends -m ping
frontend01.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
frontend02.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
收集和傳回事實
Ansible 可以收集和傳回有關目標主機的“事實”,這些事實包括 CPU 和記憶體組態、網路引數、磁碟幾何等各種有用的資訊。以下是一個過濾事實的範例:
$ ansible frontend01.example.com -m setup -a "filter=ansible_distribution*"
frontend01.example.com | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "macOS",
"ansible_distribution_major_version": "10",
"ansible_distribution_release": "18.5.0",
"ansible_distribution_version": "10.14.4"
},
"changed": false
}
更多 Ad Hoc 命令範例
以下是更多 ad hoc 命令的範例:
- 複製檔案:將檔案從 Ansible 控制主機複製到
frontends群組中的所有主機:$ ansible frontends -m copy -a "src=https://colouredev.io/etc/yum.conf dest=/tmp/yum.conf" - 建立目錄:在
frontends群組中的所有主機上建立一個新目錄,並設定特定的所有權和許可權:$ ansible frontends -m file -a "dest=/path/user1/new mode=777 owner=user1 group=user1 state=directory" - 刪除目錄:從
frontends群組中的所有主機中刪除特定目錄:$ ansible frontends -m file -a "dest=/path/user1/new state=absent" - 安裝軟體包:使用
yum在frontends群組中的所有主機上安裝httpd軟體包(如果尚未安裝):$ ansible frontends -m yum -a "name=httpd state=present"
受管節點需求
大多數 Linux 發行版預設安裝了 Python,但某些雲端作業系統映像可能為了保持小巧而刪除了重要套件,如 Python。Ansible 需要在受管節點上安裝 Python 2.7 或 3.5(及以上版本),Windows 除外,因為 Windows 使用 PowerShell。
程式碼解析:
上述所有命令都展示瞭如何使用 Ansible 的 ad hoc 命令來執行各種任務,從簡單的 ping 操作到檔案操作和軟體包管理。這些命令對於驗證 Ansible 安裝和學習如何使用不同模組非常有用。
重點整理:
- SSH 身份驗證:使用
ssh-agent和私鑰進行身份驗證。 - Inventory 定義:定義 inventory 以指定 Ansible 操作的目標主機。
- Ad Hoc 命令:使用
ansible命令執行單次任務,如 ping、檔案操作和軟體包管理。 - 事實收集:Ansible 可以收集有關目標主機的各種資訊,用於智慧 playbook 的編寫。
- 受管節點需求:大多數受管節點需要安裝 Python 2.7 或 3.5 及以上版本才能與 Ansible 協同工作。
透過瞭解這些基礎知識,您可以開始使用 Ansible 自動化您的 IT 工作流程,並進一步探索其強大的 playbook 功能。