Ansible 使您能够使用本机通信协议(如 SSH 和 WinRM)一致且可重复地轻松部署应用和系统。也许最重要的是,Ansible 是无代理的,因此不需要在托管系统上安装任何东西(除了 Python,它现在出现在大多数系统上)。因此,它使您能够为您的环境构建一个简单而强大的自动化平台。
Ansible 安装简单明了,适合大多数现代系统。它的体系结构是无服务器和无代理的,因此占用空间最小。您可以选择从中央服务器或自己的笔记本电脑运行它,选择权完全在您。您可以从一台 Ansible 控制机器上管理从单个主机到数十万个远程主机的任何东西。所有远程机器都可以由 Ansible 管理(编写足够的行动手册),并且在正确创建所有内容的情况下,您可能再也不必单独登录这些机器了。
在本章中,我们将从如何在各种操作系统上安装 Ansible 开始,开始教你涵盖 Ansible 基础知识的实用技巧。然后,在深入探讨 Ansible 如何连接到其目标主机这一主题之前,我们将了解如何配置 Windows 主机,使其能够通过 Ansible 自动化进行管理。然后,我们将研究节点需求以及如何验证您的 Ansible 安装,最后,如果您希望为 Ansible 的开发做出贡献或获得最新的功能,我们将研究如何获取和运行最新的 ansi ble 源代码。
在本章中,我们将涵盖以下主题:
- 安装和配置 Ansible
- 了解您的 Ansible 安装
- 从源代码运行与预构建的远程过程管理相比
Ansible 有一组相当少的系统需求——因此,您应该会发现,如果您有一台能够运行 Python 的机器(笔记本电脑、服务器或虚拟机),那么您将能够在其上运行 Ansible。在本章的后面,我们将演示 Ansible 在各种操作系统上的安装方法,因此由您来决定哪些操作系统适合您。
前一种说法的一个例外是微软 Windows 系统——尽管有 Python 环境可用于 Windows 系统,但目前还没有针对 Windows 系统的 Ansible 的本地版本。运行较新版本的 Windows 的读者将能够使用 Windows 子系统安装 Ansible for Linux(此后称为 WSL),并按照后面为他们选择的 WSL 环境概述的过程进行安装(例如,如果您在 WSL 上安装了 Ubuntu,您应该简单地按照本章中给出的说明在 Ubuntu 上安装 ansi ble)。
Ansible 是用 Python 编写的,因此可以在各种系统上运行。这包括最受欢迎的 Linux、FreeBSD 和 macOS 版本。唯一的例外是 Windows,虽然有本机 Python 发行版,但还没有本机 Ansible 构建。因此,在编写本文时,您最好的选择是在 WSL 下安装 Ansible,就像在本机 Linux 主机上运行一样。
一旦您建立了希望在其上运行 Ansible 的系统,安装过程通常会简单明了。在接下来的几节中,我们将讨论如何在各种不同的系统上安装 Ansible,这样大多数读者应该能够在几分钟内启动并运行 Ansible。
Ansible 的发布周期通常约为四个月,在这个短暂的发布周期中,通常会有许多变化,从小的 bug 修复到大的 bug 修复,再到新的特性,甚至有时是对语言的根本改变。最简单的方法不仅是使用 Ansible 启动和运行,还可以让自己保持最新状态,那就是使用为操作系统构建的本机包(如果有)。
例如,如果您希望在 Linux 发行版(如 CentOS、Fedora、红帽企业版 Linux ( RHEL )、Debian 和 Ubuntu)上运行 Ansible 的最新版本,我强烈建议您在基于红帽的发行版上使用操作系统包管理器,如yum
或在基于 Debian 的发行版上使用apt
。以这种方式,每当您更新操作系统时,您将同时更新 Ansible。
当然,出于某些目的,您可能需要保留特定版本的 Ansible,这可能是因为您的行动手册已经过这方面的测试。在这种情况下,您几乎肯定会选择另一种安装方法,但这超出了本书的范围。此外,建议您在可能的情况下,根据记录的最佳实践创建和维护行动手册,这应该意味着它们在大多数 Ansible 升级中都能存活。
以下是一些示例,展示了如何在几个 Linux 发行版上安装 Ansible:
- 在 Ubuntu 上安装 Ansible:要在 Ubuntu 上安装 ansi ble 控制机的最新版本,
apt
打包工具可以通过以下命令轻松实现:
$ 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
如果你正在运行一个旧版本的 Ubuntu,你可能需要用python-software-properties
代替software-properties-common
。
- **在 Debian 上安装 Ansible:**您应该在您的
/etc/apt/sources.list
文件中添加以下行:
deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main
你会注意到ubuntu
这个词和trusty
一起出现在配置的前一行,这是一个 Ubuntu 版本。在撰写本文时,Ansible 的 Debian 构建是从 Ubuntu 的 Ansible 存储库中获取的,可以毫无问题地工作。您可能需要根据您的 Debian 构建更改前面配置中的版本字符串,但是对于大多数常见的用例,这里引用的行就足够了。
完成后,您可以在 Debian 上安装 Ansible,如下所示:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
$ sudo apt-get update
$ sudo apt-get install ansible
- 在 Gentoo 上安装 Ansible:要在 Gentoo 上安装 ansi ble 控制机的最新版本,
portage
包管理器通过以下命令使安装变得容易:
$ echo 'app-admin/ansible' >> /etc/portage/package.accept_keywords
$ emerge -av app-admin/ansible
- 在 FreeBSD 上安装 Ansible:要在 FreeBSD 上安装 ansi ble 控制机的最新版本,PKG 管理器可以通过以下命令轻松完成:
$ sudo pkg install py36-ansible
$ sudo make -C /usr/ports/sysutils/ansible install
- 在 Fedora 上安装 Ansible:要在 Fedora 上安装 ansi ble 控制机的最新版本,
dnf
包管理器通过以下命令使安装变得容易:
$ sudo dnf -y install ansible
- 在 CentOS 上安装 Ansible:要在 CentOS 或 RHEL 上安装 ansi ble 控制机的最新版本,
yum
包管理器通过以下命令使安装变得容易:
$ sudo yum install epel-release
$ sudo yum -y install ansible
如果您在 RHEL 上执行前面的命令,您必须确保启用了 Ansible 存储库。如果不是,您需要使用以下命令启用相关的存储库:
$ sudo subscription-manager repos --enable rhel-7-server-ansible-2.9-rpms
- 在 Arch Linux 上安装 Ansible:要在 Arch Linux 上安装 ansi ble 控制机的最新版本,
pacman
包管理器可以通过以下命令轻松实现:
$ pacman -S ansible
一旦在您使用的特定 Linux 发行版上安装了 Ansible,您就可以开始探索了。让我们从一个简单的例子开始——当您运行ansible
命令时,您将看到类似如下的输出:
$ ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/jamesf_local/.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.17 (default, Nov 7 2019, 10:07:09) [GCC 9.2.1 20191008]
那些希望测试最新版本的 Ansible(刚从 GitHub 获得)的人可能会对构建一个安装到控制机器上的 RPM 包感兴趣。当然,这种方法只适用于基于红帽的发行版,如 Fedora、CentOS 和 RHEL。为此,您需要从 GitHub 存储库中克隆源代码,并按如下方式构建 RPM 包:
$ git clone https://github.com/ansible/ansible.git
$ cd ./ansible
$ make rpm
$ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm
既然您已经看到了如何在 Linux 上安装 Ansible,我们将简单了解一下如何在 macOS 上安装 Ansible。
在本节中,您将学习如何在 macOS 上安装 Ansible。最简单的安装方法是使用自制程序,但是也可以使用 Python 包管理器。让我们从安装 Homebrew 开始,这是一个快速方便的 macOS 软件包管理解决方案。
如果您还没有在 macOS 上安装 Homebrew,您可以轻松地安装它,如下所示:
- 安装自制程序:通常这里显示的两个命令就是在 macOS 上安装自制程序所需的全部命令:
$ xcode-select --install
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果您已经为其他目的安装了 Xcode 命令行工具,您可能会看到以下错误消息:
xcode-select: error: command line tools are already installed, use "Software Update" to update
您可能希望在 macOS 上打开 App Store,并检查是否需要更新 Xcode,但是只要安装了命令行工具,您的 Homebrew 安装应该会顺利进行。
如果您希望确认您的家酿安装成功,您可以运行以下命令,该命令将警告您安装的任何潜在问题,例如,以下输出警告我们,虽然家酿安装成功,但它不在我们的PATH
中,因此我们可能无法在不指定其绝对路径的情况下运行任何可执行文件:
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!
Warning: Homebrew's sbin was not found in your PATH but you have installed
formulae that put executables in /usr/local/sbin.
Consider setting the PATH for example like so
echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile
- 安装 Python 包管理器(pip) :如果你不想用自制程序来安装 Ansible,你可以用下面的简单命令来安装
pip
:
$ sudo easy_install pip
还要检查您的 Python 版本是否至少为 2.7,因为 Ansible 不会在任何旧版本上运行(几乎所有现代安装的 macOS 都应该是这种情况):
$ python --version
Python 2.7.16
您可以使用自制程序或 Python 包管理器在 macOS 上安装最新版本的 Ansible,如下所示:
- 通过自制程序安装 Ansible:要通过自制程序安装 ansi ble,请运行以下命令:
$ brew install ansible
- 通过 Python 包管理器(pip) : 安装 Ansible 要通过
pip
安装 Ansible,请使用以下命令:
$ sudo pip install ansible
您可能对从 GitHub 直接运行 Ansible 的最新开发版本感兴趣,如果是这样,您可以通过运行以下命令来实现:
$ pip install git+https://github.com/ansible/ansible.git@devel
现在您已经使用首选方法安装了 Ansible,您可以像以前一样运行ansible
命令,如果一切都按照计划进行,您将看到类似以下内容的输出:
$ ansible --version
ansible 2.9.6
config file = None
configured module search path = ['/Users/james/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/Cellar/ansible/2.9.4_1/libexec/lib/python3.8/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.8.1 (default, Dec 27 2019, 18:05:45) [Clang 11.0.0 (clang-1100.0.33.16)]
如果您运行的是 macOS 10.9,使用pip
安装 Ansible 时可能会遇到问题。以下是解决问题的解决方法:
$ sudo CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install ansible
如果您想更新您的 Ansible 版本,pip
可以通过以下命令轻松实现:
$ sudo pip install ansible --upgrade
同样,如果您的安装方法是brew
命令,您也可以升级它:
$ brew upgrade ansible
现在,您已经学习了在 macOS 上安装 Ansible 的步骤,让我们看看如何使用 Ansible 配置用于自动化的 Windows 主机。
如前所述,在 Windows 上没有直接安装 Ansible 的方法——简单地说,建议您在可能的情况下安装 WSL 并安装 Ansible,就像您在本地运行 Linux 一样,使用本章前面概述的过程。
然而,尽管有这种限制,Ansible 并不仅限于管理基于 Linux 和 BSD 的系统,它能够使用本机 WinRM 协议对窗口主机进行无代理管理,模块和原始命令使用 PowerShell,这在每个现代窗口安装中都可用。在本节中,您将学习如何配置窗口以使用 Ansible 启用任务自动化。
让我们看看 Ansible 在自动化 Windows 主机时能做些什么:
- 收集有关远程主机的事实。
- 安装和卸载 Windows 功能。
- 管理和查询窗口服务。
- 管理用户帐户和用户列表。
- 使用巧克力(一个软件仓库和附带的管理工具)管理软件包。
- 执行窗口更新。
- 从远程计算机获取多个文件到 Windows 主机。
- 在目标主机上执行原始 PowerShell 命令和脚本。
Ansible 允许您通过与本地用户或域用户连接,在 Windows 机器上自动执行任务。您可以使用 Windows runas
支持以管理员身份运行操作,就像 Linux 发行版上的sudo
命令一样。
此外,由于 Ansible 是开源软件,通过在 PowerShell 中创建自己的模块,甚至发送原始的 PowerShell 命令,可以轻松扩展其功能。例如,信息安全团队可以轻松管理文件系统 ACL、配置 Windows 防火墙以及管理主机名和域成员资格,使用本机 Ansible 模块和原始命令(如有必要)的混合。
Windows 主机必须满足以下要求,Ansible 控制机器才能与之通信:
- Ansible 尝试支持微软当前或扩展支持的所有 Windows 版本,包括 Windows 7、8.1 和 10 等桌面平台,以及包括 Windows Server 2008(和 r 2)、2012(和 R2)、2016 和 2019 在内的服务器操作系统。
- 您还需要安装 PowerShell 3.0 或更高版本,并且至少。NET 4.0。
- 您将需要创建并激活一个 WinRM 侦听器,这将在后面详细描述。出于安全原因,默认情况下不启用此功能。
让我们更详细地了解一下如何准备一个由 Ansible 自动执行的 Windows 主机:
- 关于先决条件,您必须确保 PowerShell 3.0 和。. NET Framework 4.0 安装在 Windows 机器上。如果您仍在使用旧版本的 PowerShell 或。NET 框架,你需要升级它们。您可以手动执行此操作,或者以下 PowerShell 脚本可以自动为您处理:
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1" (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force &$file -Verbose Set-ExecutionPolicy -ExecutionPolicy Restricted -Force
该脚本通过检查需要安装的程序(例如。NET Framework 4.5.2)和所需的 PowerShell 版本,如果需要,重新启动,并设置用户名和密码参数。脚本将自动重新启动,并在重新启动时登录,这样就不需要执行更多操作,脚本将继续运行,直到 PowerShell 版本与目标版本匹配。
如果没有设置用户名和密码参数,脚本将要求用户重新启动,并在必要时手动登录,下次用户登录时,脚本将在中断的地方继续。该过程一直持续到主机满足 Ansible 自动化的要求。
- 当 PowerShell 至少升级到 3.0 版本时,下一步将是配置 WinRM 服务,以便 Ansible 可以连接到它。WinRM 服务配置定义了 Ansible 如何与 Windows 主机接口,包括侦听器端口和协议。
如果您以前从未设置过 WinRM 侦听器,您有三种选择:
- 首先,你可以用
winrm quickconfig
做 HTTP,winrm quickconfig -transport:https
做 HTTPS。当您需要在域环境之外运行并创建一个简单的侦听器时,这是最简单的方法。这个过程的优点是在 Windows 防火墙中打开所需的端口,并自动启动 WinRM 服务。 - 如果您在域环境中运行,我强烈建议使用**【组策略对象】** ( GPOs )因为如果主机是域成员,那么配置会自动完成,无需用户输入。有许多文档化的程序可以用来完成这项工作,由于这是一项非常以 Windows 域为中心的任务,因此超出了本书的范围。
- 最后,您可以通过运行以下 PowerShell 命令来创建具有特定配置的侦听器:
$selector_set = @{
Address = "*"
Transport = "HTTPS"
}
$value_set = @{
CertificateThumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
}
New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set
The preceding CertificateThumbprint
should match the thumbprint of a valid SSL certificate that you previously created or imported into the Windows Certificate Store.
如果您在 PowerShell v3.0 中运行,您可能会遇到 WinRM 服务限制可用内存量的问题。这是一个已知的错误,有一个修复程序可以解决它。应用此修补程序的示例过程(用 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 侦听器可能是一项复杂的任务,因此能够检查配置过程的结果非常重要。以下命令(可以从命令提示符运行)将显示当前的 WinRM 侦听器配置:
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
根据前面的输出,两个监听器是活动的——一个通过 HTTP 监听端口5985
,另一个通过 HTTPS 监听端口5986
,提供更高的安全性。作为补充说明,在前面的输出中还显示了以下参数:
Transport
:这应该设置为 HTTPS 或 HTTPS,尽管强烈建议您使用 HTTPS 监听器来确保您的自动化命令不会被监听或操纵。Port
:这是监听器操作的端口,默认情况下5985
代表 HTTP,或者5986
代表 HTTPS。URLPrefix
:这是通信的 URL 前缀,默认为wsman
。如果更改,必须将 Ansible 控制主机上的ansible_winrm_path
主机设置为相同的值。CertificateThumbprint
:如果在 HTTPS 监听程序上运行,这是连接使用的 Windows 证书存储的证书指纹。
如果您在设置 WinRM 侦听器后需要调试任何连接问题,您可能会发现以下命令很有价值,因为它们在没有 Ansible 的情况下在 Windows 主机之间执行基于 WinRM 的连接,因此,您可以使用它们来区分您可能遇到的问题是否与您的 Ansible 主机有关,或者 WinRM 侦听器本身是否有问题:
# test out HTTP
winrs -r:http://<server address>:5985/wsman -u:Username -p:Password ipconfig
# test out HTTPS (will fail if the cert is not verifiable)
winrs -r:https://<server address>:5986/wsman -u:Username -p:Password -ssl ipconfig
# test out HTTPS, ignoring certificate verification
$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
如果上述命令之一失败,您应该在尝试设置或配置 Ansible 控制主机之前调查您的 WinRM 侦听器设置。
在这个阶段,Windows 应该准备好通过 WinRM 接收来自 Ansible 的通信。要完成此过程,您还需要在 Ansible 控制主机上执行一些附加配置。首先,您需要安装winrm
Python 模块,根据您的控制主机的配置,该模块以前可能安装过,也可能没有安装过。安装方式会因操作系统的不同而有所不同,但一般可以通过pip
安装在大多数平台上,如下所示:
$ pip install winrm
完成后,您将需要为您的 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
模块,使用如下命令执行端到端连接测试(根据您的清单进行调整):
$ ansible -i inventory -m ping windows
192.168.1.52 | SUCCESS => {
"changed": false,
"ping": "pong"
}
现在,您已经了解了为 Ansible 配置 Windows 主机的必要步骤,接下来让我们看看如何通过 Ansible 连接多个主机。
到本章的这个阶段,无论您为 Ansible 控制机器选择什么操作系统,您都应该有一个 Ansible 的工作安装,并以此开始探索自动化世界。在本节中,我们将对 Ansible 的基础知识进行实践探索,以帮助您理解如何使用它。一旦你掌握了这些基本技能,你就有了充分利用这本书剩余部分所需的知识。让我们从概述 Ansible 如何连接到非 Windows 主机开始。
除了 Windows 主机(如前一节末尾所述),Ansible 使用 SSH 协议与主机通信。Ansible 设计中选择这一点的原因有很多,尤其是几乎每个 Linux/FreeBSD/macOS 主机都内置了这一功能,许多网络设备(如交换机和路由器)也是如此。该 SSH 服务通常与操作系统身份验证栈集成在一起,使您能够利用 Kerberos 等东西来提高身份验证安全性。此外,OpenSSH 的功能,如ControlPersist
用于提高自动化任务的性能,SSH 跳转主机用于网络隔离和安全。
ControlPersist
is enabled by default on most modern Linux distributions as part of the OpenSSH server installation. However, on some older operating systems such as Red Hat Enterprise Linux 6 (and CentOS 6), it is not supported, and so you will not be able to use it. Ansible automation is still perfectly possible, but longer playbooks might run slower.
Ansible 使用了您已经熟悉的相同身份验证方法,SSH 密钥通常是最简单的方法,因为它们消除了用户每次运行剧本时输入身份验证密码的需要。但是,这绝不是强制性的,Ansible 通过使用--ask-pass
开关支持密码认证。如果您正在连接到主机上的非特权帐户,并且需要执行在sudo
下运行命令的可执行等效操作,那么您也可以在运行行动手册时添加--ask-become-pass
,以允许在运行时指定该操作。
自动化的目标是能够安全地运行任务,但用户干预最少。因此,强烈建议您使用 SSH 密钥进行身份验证,如果您有几个密钥需要管理,那么一定要使用ssh-agent
。
每一个可执行的任务,无论是单独运行还是作为复杂剧本的一部分,都是根据清单运行的。很简单,清单就是您希望对其运行自动化命令的主机列表。Ansible 支持多种库存格式,包括使用动态库存,动态库存可以从编排提供者自动填充自身(例如,您可以从 Amazon EC2 实例动态生成 Ansible 库存,这意味着您不必跟上云基础架构中的所有变化)。
大多数主要云供应商(例如亚马逊 EC2、谷歌云平台和微软 Azure)以及 OpenShift 和 OpenStack 等内部系统都编写了动态清单插件。Docker 甚至还有插件。开源软件的美妙之处在于,对于大多数你能想到的主要用例,有人已经贡献了代码,所以你不需要自己去弄清楚或编写。
Ansible's agentless architecture and the fact that it doesn't rely on SSL means that you don't need to worry about DNS not being set up or even time skew problems as a result of NTP not working—these can, in fact, be tasks performed by an Ansible playbook! Ansible really was designed to get your infrastructure running from a virtually bare operating system image.
现在,让我们专注于 INI 格式的清单。这里显示了一个示例,有四台服务器,每台分为两组。可对整个清单(即所有四个服务器)、一个或多个组(例如,webservers
)甚至单个服务器运行可执行命令和行动手册:
[webservers]
web1.example.com
web2.example.com
[apservers]
ap1.example.com
ap2.example.com
让我们将该清单文件与 Ansible ping
模块一起使用,该模块用于测试 Ansible 是否能够在有问题的清单主机上成功执行自动化任务。以下示例假设您已经将库存安装在默认位置,通常是/etc/ansible/hosts
。当您运行以下ansible
命令时,您会看到与此类似的输出:
$ ansible webservers -m ping
web1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
web2.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
$
请注意,ping
模块仅在webservers
组中的两台主机上运行,而不是在整个清单上运行—这是因为我们在命令行参数中指定了这一点。
ping
模块是 Ansible 数千个模块中的一个,所有这些模块都执行一组给定的任务(从在主机之间复制文件,到文本替换,再到复杂的网络设备配置)。同样,由于 Ansible 是开源软件,有一个名副其实的程序员大军正在编写和贡献模块,这意味着如果你能梦想一个任务,可能已经有了一个 Ansible 模块。即使在不存在模块的情况下,Ansible 也支持发送原始 shell 命令(或 Windows 主机的 PowerShell 命令),因此即使在这种情况下,您也可以完成所需的任务,而不必离开 Ansible。
只要 Ansible 控制主机可以与清单中的主机通信,您就可以自动执行任务。但是,值得考虑一下您将控制主机放在哪里。例如,如果您专门使用一组亚马逊 EC2 机器,那么您的 Ansible 控制机器成为 EC2 实例可能更有意义——这样,您就不会通过互联网发送所有的自动化命令。这也意味着您不需要将 EC2 主机的 SSH 端口暴露给互联网,从而使它们更加安全。
到目前为止,我们已经简单介绍了 Ansible 如何与其目标主机通信,包括什么是清单以及 SSH 通信对除 Windows 主机之外的所有主机的重要性。在下一节中,我们将在此基础上更详细地研究如何验证您的 Ansible 安装。
在本节中,您将学习如何使用简单的即席命令来验证您的 Ansible 安装。
如前所述,Ansible 可以通过几种方式向您的目标主机进行身份验证。在本节中,我们将假设您想要使用 SSH 密钥,并且您已经生成了您的公钥和私钥对,并将您的公钥应用于您将在其上自动执行任务的所有目标主机。
The ssh-copy-id
utility is incredibly useful for distributing your public SSH key to your target hosts before you proceed any further. An example command might be ssh-copy-id -i ~/.ssh/id_rsa ansibleuser@web1.example.com
.
为了确保 Ansible 可以使用您的私钥进行身份验证,您可以使用ssh-agent
—这些命令显示了一个如何启动ssh-agent
并将您的私钥添加到其中的简单示例。当然,您应该用自己的私钥替换路径:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
正如我们在上一节中所讨论的,我们还必须为 Ansible 定义一个清单来运行。这里显示了另一个简单的示例:
[frontends]
frt01.example.com
frt02.example.com
我们在上一节中使用的ansible
命令有两个重要的开关,您几乎总是会使用:-m <MODULE_NAME>
在您指定的清单中的主机上运行模块,或者使用-a OPT_ARGS
开关传递模块参数。使用ansible
二进制运行的命令称为临时命令。
以下是三个演示即席命令的简单示例,它们对于验证您的控制计算机上 Ansible 的安装和目标主机的配置也很有价值,如果配置的任何部分出现问题,它们将返回错误:
- Ping 主机:您可以使用以下命令在库存主机上执行可执行的“Ping”:
$ ansible frontends -i hosts -m ping
- 显示收集到的事实 : 您可以使用以下命令显示有关库存主机的收集到的事实:
$ ansible frontends -i hosts -m setup | less
- 过滤收集的事实:您可以使用以下命令过滤收集的事实:
$ ansible frontends -i hosts -m setup -a "filter=ansible_distribution*"
对于您运行的每个临时命令,您将获得 JSON 格式的响应——以下示例输出了成功运行ping
模块的结果:
$ ansible frontends -m ping
frontend01.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
frontend02.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ansible 还可以收集并返回关于您的目标主机的“事实”——事实是关于您的主机的各种有用信息,从 CPU 和内存配置到网络参数,再到磁盘几何形状。这些事实旨在使您能够编写执行有条件操作的智能行动手册,例如,您可能只想在内存超过 4 GB 的主机上安装给定的软件包,或者可能只在 macOS 主机上执行特定的配置。以下是从基于 macOS 的主机中筛选出的事实示例:
$ 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
即席命令非常强大,不仅可以验证您的 Ansible 安装,还可以学习 Ansible 以及如何使用模块,因为您不需要编写完整的剧本,只需使用即席命令运行一个模块,并了解它如何响应。这里有一些特别的例子供你考虑:
- 使用以下命令将文件从可扫描控制主机复制到
frontends
组中的所有主机:
$ ansible frontends -m copy -a "src=/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"
- 如果
httpd
包不存在,用yum
安装它——如果存在,不要更新它。同样,这适用于frontends
库存组中的所有主机:
$ ansible frontends -m yum -a "name=httpd state=present"
- 以下命令与前一个类似,只是将
state=present
更改为state=latest
会导致 Ansible 在软件包不存在的情况下安装(最新版本的)软件包,如果存在则将其更新为最新版本:
$ ansible frontends -m yum -a "name=demo-tomcat-1 state=latest"
- 显示清单中所有主机的所有事实(警告-这将产生大量的 JSON!):
$ ansible all -m setup
现在,您已经了解了更多关于验证 Ansible 安装以及如何运行临时命令的知识,接下来让我们更详细地了解 Ansible 要管理的节点的要求。
到目前为止,我们几乎只关注了对 Ansible 控制主机的要求,并假设(除了 SSH 密钥的分发)目标主机将正常工作。当然,情况并不总是如此,例如,虽然从国际标准化组织安装的现代 Linux 安装通常只能工作,但云操作系统映像通常会被剥离以保持较小,因此可能缺少重要的包,如 Python,没有 Python,Ansible 无法运行。
如果您的目标主机缺少 Python,通常很容易通过操作系统的包管理系统安装它。Ansible 要求您在 Ansible 控制机器(如本章前面所述)和每个托管节点上安装 Python 或 3.5(及以上版本)。同样,这里的例外是 Windows,它依赖于 PowerShell。
如果您正在使用缺少 Python 的操作系统映像,以下命令提供了安装 Python 的快速指南:
- 要使用
yum
安装 Python(在旧版本的 Fedora 和 CentOS/RHEL 7 及更低版本上),请使用以下命令:
$ sudo yum -y install python
- 在 RHEL 和 CentOS 版本 8 以及更新版本的 Fedora 上,您可以使用
dnf
包管理器来代替:
$ sudo dnf install python
您也可以选择安装特定的版本来满足您的需求,如本例所示:
$ sudo dnf install python37
- 在 Debian 和 Ubuntu 系统上,您将使用
apt
包管理器安装 Python,如果需要,再次指定一个版本(这里给出的例子是安装 Python 3.6,将在 Ubuntu 18.04 上工作):
$ sudo apt-get update
$ sudo apt-get install python3.6
我们在本章前面针对 Ansible 讨论的ping
模块不仅检查与托管主机的连接和身份验证,还使用托管主机的 Python 环境来执行一些基本的主机检查。因此,这是一个非常棒的端到端测试,让您确信您的托管主机被正确配置为主机,连接和身份验证设置完美,但是如果缺少 Python,它将返回failed
结果。
当然,在这个阶段,一个完美的问题是:如果您在没有 Python 的情况下使用精简的基础映像推出 100 台云服务器,Ansible 如何提供帮助?这是否意味着在开始自动化之前,您必须手动检查所有 100 个节点并手动安装 Python?
谢天谢地,多亏了raw
模块,即使在这种情况下,Ansible 也已经覆盖了你。该模块用于向受管节点发送原始外壳命令,它既适用于 SSH 管理的主机,也适用于 Windows PowerShell 管理的主机。因此,您可以使用 Ansible 在缺少 Python 的一整套系统上安装 Python,甚至可以运行整个 shell 脚本来引导托管节点。最重要的是,原始模块是极少数不需要在托管节点上安装 Python 的模块之一,因此它非常适合我们的用例,我们必须推出 Python 来实现进一步的自动化。
以下是 Ansible 行动手册中的一些任务示例,您可以使用这些任务来引导托管节点并为 Ansible 管理做好准备:
- name: Bootstrap a host without python2 installed
raw: dnf install -y python2 python2-dnf libselinux-python
- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
raw: cat < /tmp/*txt
args:
executable: /bin/bash
- name: safely use templated variables. Always use quote filter to avoid injection issues.
raw: "{{package_mgr|quote}} {{pkg_flags|quote}} install {{python|quote}}"
现在,我们已经介绍了在控制主机和受管节点上设置 Ansible 的基础知识,并简要介绍了如何配置第一个连接。在我们结束这一章之前,我们将更详细地了解您如何运行直接来自 GitHub 的 Ansible 的最新开发版本。
Ansible 总是在快速发展,有时,要么是为了尽早访问新特性(或模块),要么是作为您自己开发工作的一部分,您希望运行 GitHub 最新的、最前沿的 Ansible 版本。在本节中,我们将了解如何使用源代码快速启动和运行。本章中概述的方法的优点是,与必须以根用户身份执行的基于包管理器的安装不同,最终结果是 Ansible 的工作安装,而不需要任何根用户权限。
让我们从查看 GitHub 最新版本的源代码开始:
- 您必须首先从
git
存储库中克隆源代码,然后更改为包含签出代码的目录:
$ git clone https://github.com/ansible/ansible.git --recursive
$ cd ./ansible
- 在您可以继续任何开发工作,或者实际上从源代码运行 Ansible 之前,您必须设置您的 shell 环境。为此提供了几个脚本,每个脚本都适合不同的 shell 环境。例如,如果您正在运行古老的 Bash shell,您可以使用以下命令设置您的环境:
$ source ./hacking/env-setup
相反,如果您正在运行 Fish shell,您可以按如下方式设置您的环境:
$ source ./hacking/env-setup.fish
- 设置好环境后,必须安装
pip
Python 包管理器,然后使用它安装所有需要的 Python 包(注意:如果系统上已经有了pip
,可以跳过第一个命令):
$ sudo easy_install pip
$ sudo pip install -r ./requirements.txt
请注意,当您运行env-setup
脚本时,您将从源代码签出运行,默认清单文件将是/etc/ansible/hosts
。您可以选择指定除/etc/ansible/hosts
以外的库存文件。
- 运行
env-setup
脚本时,Ansible 从源代码签出运行,默认库存文件为/etc/ansible/hosts
;但是,您可以根据需要在机器上的任何位置指定库存文件(有关更多详细信息,请参见使用库存 、https://docs . ansi ble . com/ansi ble/latest/user _ guide/intro _ Inventory . html #库存)。下面的命令提供了一个如何做到这一点的例子,但是很明显,您的文件名和内容肯定会有所不同:
$ echo "ap1.example.com" > ~/my_ansible_inventory
$ export ANSIBLE_INVENTORY=~/my_ansible_inventory
ANSIBLE_INVENTORY
适用于 Ansible 及以上版本,并取代了不推荐使用的ANSIBLE_HOSTS
环境变量。
一旦您完成了这些步骤,您就可以完全按照我们在本章中讨论的方式运行 Ansible,只是您必须指定它的绝对路径。例如,如果您按照前面的代码设置您的清单,并将 Ansible 源克隆到您的主目录中,您可以运行我们现在熟悉的临时ping
命令,如下所示:
$ ~/ansible/bin/ansible all -m ping
ap1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
当然,Ansible 源树是不断变化的,你不太可能只想坚持你克隆的副本。到了更新的时候,不需要克隆新的副本;您可以简单地使用以下命令更新现有的工作副本(同样,假设您最初将源树克隆到主目录中):
$ git pull --rebase
$ git submodule update --init --recursive
以上就是我们对设置 Ansible 控制机器和托管节点的介绍。希望您在本章中获得的知识将帮助您安装和运行您自己的 Ansible,并为本书的其余部分奠定基础。
Ansible 是一款功能强大、用途广泛但简单的自动化工具,其主要优势在于其无代理架构和简单的安装过程。Ansible 旨在让您以最少的努力快速从零到自动化,在本章中,我们已经展示了 Ansible 的简单易用性。
在本章中,您学习了设置 Ansible 的基础知识—如何安装它来控制其他主机以及对 Ansible 管理的节点的要求。您学习了为 Ansible 自动化设置 SSH 和 WinRM 所需的基础知识,以及如何引导托管节点以确保它们适合 Ansible 自动化。您还了解了临时命令及其优点。最后,您学习了如何直接从 GitHub 运行最新版本的代码,这既使您能够直接为 Ansible 的开发做出贡献,又使您能够访问最新的功能,如果您希望在基础架构中使用它们的话。
在下一章中,我们将学习 Ansible 语言基础知识,使您能够编写第一份行动手册,并帮助您创建模板化配置和开始构建复杂的自动化工作流。
- 您可以在哪些操作系统上安装 Ansible?(多个正确答案)
(A) Ubuntu
软呢帽
C) Windows 2019 服务器
(D) HP-UX
e)主机
- Ansible 使用哪种协议连接远程机器来运行任务?
A) HTTP
HTTPS
(C) SSH
(D) TCP
(E) UDP
- 要在 Ansible 即席命令行中执行特定模块,您需要使用
-m
选项。
真的吗
假的
- 关于通过谷歌群的邮件列表安装的任何问题,请参见以下内容:
https://groups.google.com/forum/#!forum/ansible-project
- 如何安装最新版本的
pip
可以在这里找到:
https://pip.pypa.io/en/stable/installing/#installation
- 使用 PowerShell 的特定 Windows 模块可在此找到:
https://github . com/ansi ble/ansi ble-modules-core/tree/dev/windows
- 如果您有一个 GitHub 帐户,并且想要关注 GitHub 项目,您可以继续跟踪 Ansible 的问题、bug 和想法: