概述
Ansible是自动化运维工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块(module)和剧本(playbook)工作。
安装指南
本次在Ubuntu上安装Ansible 2.7 . 更详细安装方式参见: Ansible 安装指南
服务器端的要求
目前Ansible可以从安装了Python 2(2.7版)或Python 3(3.5及更高版本)的任何机器上运行。控制计算机不支持Windows。
这包括Red Hat,Debian,CentOS,macOS,任何BSD等等。
服务器端安装Ansible
通过Apt (Ubuntu)安装最新版本
这里有一个PPA版本的Ubuntu源。
要在您的计算机上配置PPA并安装ansible,请运行以下命令:
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt-get install ansible
:exclamation:
在较旧的Ubuntu发行版中,“software-properties-common”被称为“python-software-properties”。
Windows 指南
设置Windows主机
主机要求
要使Ansible与Windows主机通信并使用Windows模块,Windows主机必须满足以下要求:
- Ansible支持的Windows版本通常与Microsoft当前和扩展支持下的版本相匹配。支持的桌面操作系统包括Windows 7,8.1和10,受支持的服务器操作系统包括Windows Server 2008,2008 R2,2012,2012 R2和2016。
- Ansible需要PowerShell 3.0或更高版本,并且至少要在Windows主机上安装.NET 4.0。
- 应创建并激活**WinRM listener **。更多细节可以在下面找到。
:exclamation:
虽然这些是Ansible连接的基本要求,但是一些Ansible模块还有其他要求,例如较新的OS或PowerShell版本。请参阅模块的文档页面以确定主机是否满足这些要求。
升级PowerShell和.NET框架
升级powershell需要重启服务器才能生效。
Ansible需要PowerShell 3.0版和.NET Framework 4.0或更高版本才能在较旧的操作系统(如Server 2008和Windows 7)上运行。基本OS镜像不符合此要求。您可以使用Upgrade-PowerShell.ps1脚本来更新这些脚本。
这是如何从PowerShell运行此脚本的示例:
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1"
$username = "Administrator"
$password = "Password"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
# version can be 3.0, 4.0 or 5.1
&$file -Version 5.1 -Username $username -Password $password -Verbose
完成后,您将需要删除自动登录并将执行策略设置回默认值Restricted
。您可以使用以下PowerShell命令执行此操作:
# this isn't needed but is a good security practice to complete
Set-ExecutionPolicy -ExecutionPolicy Restricted -Force
$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue
该脚本的工作原理是检查需要安装哪些程序(例如.NET Framework 4.5.2)以及需要什么样的PowerShell版本。如果需要重新启动并且设置了username
和password
参数,则脚本将在重新启动时自动重新启动并登录。该脚本将继续,直到不再需要执行任何操作且PowerShell版本与目标版本匹配为止。如果未设置username
和 password
参数,脚本将提示用户手动重新引导并在需要时登录。当用户下次登录时,脚本将从停止的位置继续,并且该过程将继续,直到不再需要其他操作为止。
:exclamation:
如果在Server 2008上运行,则必须安装SP2。如果在Server 2008 R2或Windows 7上运行,则必须安装SP1。
Windows Server 2008只能安装PowerShell 3.0; 指定较新的版本将导致脚本失败。
username
和password
参数都是存储在注册表中的纯文本。确保在脚本完成后运行清理命令,以确保主机上仍未存储凭据。
WinRM内存补丁
在PowerShell v3.0上运行时,WinRM服务存在一个错误,它限制了WinRM可用的内存量。如果未安装此补丁,Ansible将无法在Windows主机上执行某些命令。这些补丁应作为系统引导或映像过程的一部分安装。Install-WMF3Hotfix.ps1脚本可用于在受影响的主机上安装此修补程序。
以下PowerShell命令将安装此修补程序:
$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
WinRM设置
一旦Powershell升级到至少3.0版本,最后一步是配置WinRM服务,以便Ansible可以连接到它。WinRM服务有两个主要组件,用于管理Ansible如何与Windows主机连接:listener
和service
配置设置。
可以在下面阅读有关每个组件的详细信息,也可以使用脚本ConfigureRemotingForAnsible.ps1来进行基本设置。此脚本使用自签名证书设置HTTP和HTTPS侦听器,并在服务上启用Basic
身份验证选项。
要使用此脚本,请在PowerShell中运行以下命令:
$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
:exclamation:
ConfigureRemotingForAnsible.ps1脚本仅用于培训和开发目的,不应在生产环境中使用,因为它启用了
Basic
这本质上不安全(如身份验证)。
WinRM Listener
WinRM服务侦听一个或多个端口上的请求。每个端口都必须创建并配置一个侦听器。
要查看在WinRM服务上运行的当前侦听器,请运行以下命令:
winrm quickconfig
winrm enumerate winrm/config/Listener
运行后输出如下:
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 set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
windows 防火墙配置
配置防火墙:
- 添加防火墙信任规则,允许5985-5986端口通过
- 打开防火墙高级配置,选择入站规则,在点击新建规则
- 填写一下信息
- TCP
- 信任端口5985-5986
- 填写新建规则名称
Ansible服务器端配置并管理Windows
添加windows客户端连接信息: 编辑/etc/ansible/hosts
, 添加客户端主机信息(ansible服务端的配置)
[windows]
192.168.2.2 ansible_user="Administrator" ansible_password="Password" ansible_port=5986 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore ansible_winrm_transport=basic
ping 远程windows主机
$ ansible 192.168.2.2 -m win_ping
192.168.2.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
创建目录
$ ansible 192.168.2.2 -m win_file -a 'path=D:\\test state=directory'
192.168.2.2 | CHANGED => {
"changed": true
}
下发文件
$ ansible 192.168.2.2 -m win_copy -a 'src=/etc/hosts dest=D:\\hosts.txt'
192.168.2.2 | CHANGED => {
"changed": true,
"checksum": "f6d471689e1233342a8e43a130ff40a6ea0b9f51",
"dest": "D:\\hosts.txt",
"operation": "file_copy",
"original_basename": "hosts",
"size": 635,
"src": "/etc/hosts"
}
删除文件
# ansible 192.168.2.2 -m win_file -a 'dest=d:\\config_dir\\hosts.txt state=absent'
删除目录
# ansible 192.168.2.2 -m win_file -a 'dest=d:\\config_dir2 state=absent'
执行cmd命令
# ansible 192.168.2.2 -m win_shell -a 'ipconfig'
重启windows
# ansible 192.168.2.2 -m win_reboot
# ansible 192.168.2.2 -m win_shell -a 'shutdown -r -t 0'
创建用户
远程在windows客户端上创建用户
# ansible 192.168.2.2 -m win_user -a "name=testuser1 passwd=123456"
windows服务管理
# ansible 192.168.2.2 -m win_shell -a “net stop|start zabbix_agent”
完整的windows module见: Windows modules