簡述
背景
Ansible是一款輕量級的開源的自動化運維工具,支援linux和windows(只支援client,並且部分模組),利用Ansible可以簡單批量的配置系統,安裝軟體,或者更高階的運維任務(比如滾動升級)。
Ansible之類的運維工具對運維工作進行抽象及規範,能夠極大的降低運維難度。本文只是為了演示如何通過ansible 的各模組對windows進行傳輸檔案,管理賬號,執行指令碼等批量自動化管理工作
實驗環境
型別 | 系統 | ip |
---|---|---|
Server | Ubuntu Server 16.04.5 LTS X64 | 192.168.0.22 |
Client | Windows Server 2008 R2 SP1 | 192.168.0.23 |
注意:
如果是實驗目的,建議用Vmware,並且在關鍵操作時備份快照(比如,剛裝完環境,升級完PS和.Net後),這樣能夠及時,乾淨的還原現場,節省每次重灌系統導致的時間浪費
Windows 被控端(Ansible Client)
Ansible 只支援Powershell 4.0及以上(用3.0會報 Process is terminated due to StackOverflowException.),所以要求最低要求Win7,或者Win server 2008,詳見 Ansible Doc host requirements
升級PowerShell 和.Net Framework
官方文件要求升級至ps3.0即可,但是實驗發現,3.0會報錯
Win+R
-> PowerShell
開啟PowerShell
輸入 $PSVersionTable
檢視 PSVersion
確保大於等於4.0(PowerShell 4.0),以及 CLRVersion
大於等於4.0(.NET Framework 4.0) ,如果版本過低,則執行下面程式碼,直接複製到PowerShell 執行即可,建議使用5.1(參考 hotfixv4.trafficmanager.net dont work 和 安裝和配置 WMF 5.1)
注意:
-
注意使用者名稱密碼改成管理員的使用者名稱密碼
-
確保能夠訪問外網
-
PowerShell以管理員模式開啟
-
PS3不能直升PS5,需要解除安裝PS3或者儲存 PSModulePath
-
安裝PS5需要先打最新SP補丁
-
PS5要求 .NET Framework 不低於 4.5.2
-
安裝成功後會自動重啟伺服器,注意別影響其他服務
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1"
$username = "管理員使用者名稱"
$password = "管理員密碼"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
# PowerShell 版本,只能用 3.0, 4.0 和 5.1
&$file -Version 5.1 -Username $username -Password $password -Verbose
複製程式碼
重啟後,再次開啟PS ,輸入 $PSVersionTable
檢視版本
安裝WinRM,並且配置監聽
## 配置WinRM
$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file
## 設定允許非加密遠端連線,不太安全
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
複製程式碼
使用非加密連線,有安全隱患,此處不作為實驗重點,感興趣的,可以參考 PowerShell 配置winrm使用HTTPS
Linux主控端(Ansible Server)
安裝Ansible和pywinrm
參考 Installing the Control Machine
$ sudo apt-get update
$ sudo apt-get install -y software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt-get install -y ansible
$ ansible --version
ansible 2.7.7
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.12 (default, Nov 12 2018, 14:36:49) [GCC 5.4.0 20160609]
$ pip install "pywinrm>=0.3.0"
複製程式碼
配置Inventory
預設是 Inventory /etc/ansible/hosts
,此處改為手動指定,Ansible的Inventory支援ini格式和yaml格式,本文采用yaml格式
$ mkdir ansible
$ tee ansible/test_hosts.yaml <<-'EOF'
winserver:
hosts:
192.168.0.23:
vars:
ansible_user: Administrator
ansible_password: 密碼
ansible_connection: winrm
ansible_winrm_transport: basic
ansible_port: 5985
EOF
複製程式碼
探測主機是否存活
$ ansible -i ansible/test_hosts.yaml winserver -m win_ping
192.168.0.23 | SUCCESS => {
"changed": false,
"ping": "pong"
}
複製程式碼
更多實驗,參見參考資料中的兩篇51cto中的博文
可用的Windows模組
根據 What modules are available? 絕大部分Module都是針對Linux編寫的,大部分在windows下不能正常使用,有一些專用的windows module 使用ps編寫的,可用在windows下使用,詳細列表參見 Windows modules
Windows常見問題
官方文件中列舉了Ansible windows常見問題,建議仔細閱讀
Ansible Playbook
Ansible配合playbook食用更佳,上述中的 ansible
命令是adhoc命令模式,類似在bash中手動執行命令,多用於簡單,並且不需要複用場景,而 ansible-playbook
類似 bash指令碼,但是更強大,適合複雜任務編排場景。
考慮後期出一個playbook的文章
推薦配合vscode的ansible 外掛(github repo 地址 github.com/VSChina/vsc…)
效果如下所示,比idea的ansible強大很多。
參考資料
招聘小廣告
山東濟南的小夥伴歡迎投簡歷啊 加入我們 , 一起搞事情。
長期招聘,Java程式設計師,大資料工程師,運維工程師。