ansible自動化管理windowsシステム実戦

12111 ワード

一、簡単に述べる
1、日常システムの自动化运维の过程の中でどうしてもwindowsシリーズのサーバーがあることを说明して、オープンソースのソフトウェアにとって今多くのwindowsのロット管理の互換性に対してあまりよくありません;Linuxシステムのように便利ではありませんが、現実にはwindowsを走る必要がある業務があります.検索して振り回すと、pythonが開発したansible(redhatに買収された)には比較的良い解決策があり、振り回すことで、コミュニケーションを忘れるために整理されていることがわかりました.
2、実験環境サーバー側:CentOS 7.4_x 64 python 2.7.5 ip:172.16.3.167ソースコードインストールansible持参
管理されるwindows側:win 7 sp 1_x 32 Powershell 3.0+ip:172.16.3.188およびwinrmサービスオープンファイアウォールルールが必要
3、実験目標はansibleの各モジュールを通じてwindowsに対してファイルを転送し、アカウントを管理し、スクリプトなどのロット自動化管理を実行することができる.
二、ansible配置
1、概要Ansibleは1.7+バージョンからWindowsをサポートするが、管理機はLinuxシステムでなければならない.リモートホストの通信方式もLinux下のSSHからPowerShellになる.管理機はPythonのpywinrmモジュールをインストールする必要があるが、PowerShellは3.0+バージョンでManagement Framework 3.0+バージョンで、Windows 7 SP 1とWindows Server 2008 R 2以上のバージョンのシステムは簡単な構成でAnsibleと正常に通信できる.2、環境準備以下の配置はCentOS 7にある.4_x 64でのpipおよび依存関係のインストール
  pip
#wget https://bootstrap.pypa.io/get-pip.py
#python get-pip.py
    
#pip install pywinrm paramiko PyYAML Jinja2 httplib2 six

3、ソースコードのインストールansible
# git clone git://github.com/ansible/ansible.git --recursive
#cd ./ansible
#source ./hacking/env-setup

env-setupスクリプトを実行することは、Ansibleがソースコードに基づいて実行することを意味する.デフォルトのinventoryファイルは/etc/ansible/hostsca/etc/ansible/hosts注です.このステップをPOSTに追加できます.
[win7]
172.16.3.188 ansible_ssh_user="virtual" ansible_ssh_pass="myself." ansible_ssh_port=5985 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore

注意上の情報は1行にあります.スペースで区切られ、[win 7]はこのホストのタイトルです.次はipや接続情報などです.以上のansible管理端はすでに配置して、被管理端win 7はまだ配置していないで、相対的に少し面倒です
三、被管理端win 7の配置
1、環境紹介とLinuxは少し違います.管理される側のシステムがWindowsシリーズの場合;あらかじめ以下の構成が必要です.Framework 3.0+(ダウンロードが必要かもしれません)をインストールしてpowershellポリシーをremotesignedにアップグレードします.PowerShellを3.0+(win 7のデフォルトは2.0)にアップグレードします.Windowsのリモート管理を設定します.英語でWS-Manager(WinRM)と呼ばれます.
2、環境構成a、Frameworkのアップグレードまたはインストール4.5 Framework版が満たされない場合は、マイクロソフトにbを公式にダウンロードし、Powershellポリシーをremotesignedに変更して図のようにする.
c、PowerShellを3.0にアップグレードし、以下のスクリプトをupgradeとして保存する.to_ps3.ps1
# Powershell script to upgrade a PowerShell 2.0 system to PowerShell 3.0 
# based on http://occasionalutility.blogspot.com/2013/11/everyday-powershell-part-7-powershell.html 
# some Ansible modules that may use Powershell 3 features, so systems may need 
# to be upgraded.  This may be used by a sample playbook.  Refer to the windows 
# documentation on docs.ansible.com for details. 
# - hosts: windows 
#   tasks: 
#     - script: upgrade_to_ps3.ps1 

# Get version of OS 

# 6.0 is 2008 
# 6.1 is 2008 R2 
# 6.2 is 2012 
# 6.3 is 2012 R2 

 if ($PSVersionTable.psversion.Major -ge 3) 
 { 
     write-host "Powershell 3 Installed already; You don't need this" 
    Exit 
} 

 $powershellpath = "C:\powershell" 

function download-file 
 { 
     param ([string]$path, [string]$local) 
     $client = new-object system.net.WebClient 
    $client.Headers.Add("user-agent", "PowerShell") 
    $client.downloadfile($path, $local) 
 } 

 if (!(test-path $powershellpath)) 
{ 
    New-Item -ItemType directory -Path $powershellpath 
} 

# .NET Framework 4.0 is necessary. 

 #if (($PSVersionTable.CLRVersion.Major) -lt 2) 
 #{ 
#    $DownloadUrl = "http://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_x86_x64.exe" 
#    $FileName = $DownLoadUrl.Split('/')[-1] 
#    download-file $downloadurl "$powershellpath\$filename" 
#    ."$powershellpath\$filename" /quiet /norestart 
#} 

 #You may need to reboot after the .NET install if so just run the script again. 

 # If the Operating System is above 6.2, then you already have PowerShell Version > 3 
 if ([Environment]::OSVersion.Version.Major -gt 6) 
 { 
     write-host "OS is new; upgrade not needed." 
    Exit 
} 

 $osminor = [environment]::OSVersion.Version.Minor 

$architecture = $ENV:PROCESSOR_ARCHITECTURE 

 if ($architecture -eq "AMD64") 
 { 
     $architecture = "x64" 
 }   
 else 
 { 
     $architecture = "x86"  
}  

if ($osminor -eq 1) 
 { 
     $DownloadUrl = "http://download.microsoft.com/download/E/7/6/E76850B8-DA6E-4FF5-8CCE-A24FC513FD16/Windows6.1-KB2506143-" + $architecture + ".msu" 
} 
elseif ($osminor -eq 0) 
 { 
     $DownloadUrl = "http://download.microsoft.com/download/E/7/6/E76850B8-DA6E-4FF5-8CCE-A24FC513FD16/Windows6.0-KB2506146-" + $architecture + ".msu" 
} 
 else 
 { 
    # Nothing to do; In theory this point will never be reached. 
     Exit 
} 

$FileName = $DownLoadUrl.Split('/')[-1] 
download-file $downloadurl "$powershellpath\$filename" 

Start-Process -FilePath "$powershellpath\$filename" -ArgumentList /quiet 

スクリプトはgithub upgradeに由来します.to_ps3.ps1
右クリック-->管理者が実行して数分待つ(具体的な時間はダウンロードの速度を見て、タスクマネージャにpowershellがあればダウンロードしてインストールしていることを説明する)と、システムは自動的にアップグレードインストールpowershellを3.0に再起動します.図のように、再起動後にpowershell情報を表示します.
d、Windowsリモート管理(WS-Manager、WinRM)サービスwinrmサービスのデフォルト設定はすべて有効になっていない状態である.Powershellではなくcmdで実行されるwinrmサービスのインフラストラクチャに注意してください.
winrm quickconfig
C:\Users\san02>winrm quickconfig
          WinRM   。
WinRM                         。
        :
  HTTP://*     WinRM        WS-Man         IP    。
   WinRM      。
       [y/n]? y
WinRM        ,       。
  HTTP://*     WinRM        WS-Man         IP    。
WinRM         。

  winrm service listener
winrm e winrm/config/listener
C:\Users\san02>winrm e winrm/config/listener
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 127.0.0.1, 172.16.3.137, ::1, fe80::100:7f:fffe%13, fe80::5efe
:172.16.3.137%12, fe80::4865:97de:bb1f:877%11

  auth  true(   false)
winrm set winrm/config/service/auth @{Basic="true"}C:\Users\san02>winrm set winrm/config/service/auth @{Basic="true"}
Auth
    Basic = true
    Kerberos = true
    Negotiate = true
    Certificate = false
    CredSSP = false
    CbtHardeningLevel = Relaxed

         
winrm set winrm/config/service @{AllowUnencrypted="true"}
C:\Users\san02>winrm set winrm/config/service @{AllowUnencrypted="true"}
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;
;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = true
    Auth
        Basic = true
        ......    .......

これで管理側win 7の環境構成が完了!
四、Ansible管理windowsのテスト
1、接続状態の表示
[root@localhost ~]# ansible win7 -m win_ping
172.16.3.188 | SUCCESS => {
    "attempts": 1, 
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}

2、Windows Factsの取得
[root@localhost ~]# ansible win7 -m   setup
172.16.3.188 | SUCCESS => {
    "ansible_facts": {
        "ansible_architecture": "32-bit", 
        "ansible_bios_date": "12/01/2006", 
        "ansible_bios_version": "VirtualBox", 
        "ansible_date_time": {
            "date": "2018-01-24", 
            "day": "24", 
            "epoch": "1516816620.86637", 
            "hour": "17", 
            "iso8601": "2018-01-24T09:57:00Z", 
            "iso8601_basic": "20180124T175700861308", 
            "iso8601_basic_short": "20180124T175700", 
            "iso8601_micro": "2018-01-24T09:57:00.861308Z", 
            "minute": "57", 
            "month": "01", 
            "second": "00", 
    ......    .......

3、リモート実行コマンドリモート実行コマンドはリモート実行windowsオリジナル自有コマンドに分けられ、rawモジュールを通じて、例えば「ipconfig」リモート実行ansibleのwin_commandモジュールは、ansibleの拡張コマンド、例えば「whoami」のデフォルトが文字化けしている場合、winrmモジュールファイルを変更する必要があるコマンドを実行することもできます.
sed -i "s#tdout_buffer.append(stdout)#tdout_buffer.append(stdout.decode('gbk').encode('utf-8'))#g" /usr/lib/python2.7/site-packages/winrm/protocol.py
sed -i "s#stderr_buffer.append(stderr)#stderr_buffer.append(stderr.decode('gbk').encode('utf-8'))#g" /usr/lib/python2.7/site-packages/winrm/protocol.py
a、  ip  
[root@localhost ~]# ansible win7 -m raw -a "ipconfig"
172.16.3.188 | SUCCESS | rc=0 >>
Windows IP Configuration
Ethernet adapter     :

   Connection-specific DNS Suffix  . : 
   Link-local IPv6 Address . . . . . : fe80::c55d:90f1:8d60:5d97%11
   IPv4 Address. . . . . . . . . . . : 172.16.3.188
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : fe80::daae:90ff:fe02:9d81%11
                                       172.16.3.1
         .....  .....

b、win_command        
[root@localhost ansible]# ansible win7 -m win_command -a "whoami"
172.16.3.188 | SUCCESS | rc=0 >>
virtual_san\virtual

c、    
[root@localhost ansible]# ansible win7 -m raw -a "cmd /c 'move /y d:\issue c:\issue'"
172.16.3.188 | SUCCESS | rc=0 >>
        1 file(s) moved

d、     
[root@localhost ansible]# ansible win7 -m raw -a "mkdir d:\\tst"
172.16.3.188 | SUCCESS | rc=0 >>
    Directory: D:\
Mode                LastWriteTime     Length Name                              
----                -------------     ------ ----                              
d----         2018/1/25     16:44            tst   

e、       
[root@localhost ansible]# ansible win7 -m win_file -a "path=D:\1.txt state=absent"
172.16.3.188 | SUCCESS => {
    "attempts": 1, 
    "changed": true, 
    "failed": false
}

f、     
    tasklist        
[root@localhost ansible]# ansible win7 -m raw -a "taskkill /F /IM QQ.exe /T" 
172.16.3.188 | SUCCESS | rc=0 >>
SUCCESS: The process with PID 3504 (child process of PID 2328) has been terminated

4、ファイルをwin 7に転送管理側が/etc/issueファイルを現在のディレクトリにコピー(直接/etc/issue)してターゲットホストDディスクに転送(ファイル名を変更可能)
[root@localhost ~]# ansible win7 -m  win_copy -a "src=issue dest=D:\issue"
172.16.3.188 | SUCCESS => {
    "attempts": 1, 
    "changed": true, 
    "checksum": "5c76e3b565c91e21bee303f15c728c71e6b39540", 
    "dest": "D:\\issue", 
    "failed": false, 
    "operation": "file_copy", 
    "original_basename": "issue", 
    "size": 23, 
    "src": "issue"
}

5、ユーザーの追加
[root@localhost ansible]# ansible win7 -m win_user -a "name=san2 passwd=123.c0m groups=Administrators"
172.16.3.188 | SUCCESS => {
    "account_disabled": false, 
    "account_locked": false, 
    "attempts": 1, 
    "changed": true, 
    "description": "", 
    "failed": false, 
    "fullname": "san2", 
    "groups": [
        {
            "name": "Administrators", 
            "path": "WinNT://WORKGROUP/VIRTUAL_SAN/Administrators"
        }
    ], 
    "name": "san2", 
    "password_expired": true, 
    "password_never_expires": false, 
    "path": "WinNT://WORKGROUP/VIRTUAL_SAN/san2", 
    "sid": "S-1-5-21-2708087092-4192450616-382865091-1004", 
    "state": "present", 
    "user_cannot_change_password": false
}

以上の実践を通じて、ansibleを通じてwindowsを一括管理するには、windows上でpowershellに基づいてwindrmサービスを配置することを前提としていることが分かった.その後ansibleはモジュールとwinrmサービスを通じて遠隔指管理する.ここでは、一般的な管理モジュールを簡単に列挙しただけです.もっと使いやすいモジュールは公式windowsの利用可能なモジュールを参照してください.自動構成などが含まれています.
転載先:https://blog.51cto.com/dyc2005/2064746