如何在 Ubuntu 22.04 上安装和配置 Ansible
本教程适用于这些操作系统版本
- Ubuntu 22.04(果酱水母)
- Ubuntu 18.04(仿生海狸)
在此页
- 先决条件
- 第 1 步 - 安装 Ansible
- 第 2 步 - 设置库存文件
- 将服务器组织成组和子组
- 使用现有公钥在节点上设置 SSH 密钥
- 检查磁盘使用情况
- 针对单个主机和组
- 更新所有服务器
Ansible 是一种非常流行的配置管理工具,旨在简化控制大量服务器的过程。它可以使用单个命令或文件自动完成设置新服务器和安装应用程序的过程。您可以从单个节点控制尽可能多的服务器并同时在它们上运行进程。 Ansible 不需要在服务器节点上安装任何特殊软件,并且可以通过 SSH 控制它们。
在本指南中,我们将学习如何在 Ubuntu 22.04 服务器上安装和配置 Ansible。
先决条件
- 两个或多个运行 Ubuntu 22.04 并安装了 OpenSSH 服务器的服务器系统。
- 服务器和节点都可以通过公共 IP 地址访问。
- 在 Ansible 服务器上设置了具有 sudo 权限的非根用户,并在 Ansible 客户端上设置了具有密码的根用户。
第 1 步 - 安装 Ansible
我们将使用 Ansibles 官方存储库来安装其最新版本。将 Ansibles 官方仓库添加到服务器。
$ sudo add-apt-repository ppa:ansible/ansible
幸运的是,Ubuntu 附带了我们将要安装的 Ansible 2.9。运行以下命令来安装 Ansible。
$ sudo apt install ansible -y
通过运行以下命令测试您的安装。
$ ansible --version ansible [core 2.13.3rc1] config file = /etc/ansible/ansible.cfg configured module search path = ['/home/navjot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible ansible collection location = /home/navjot/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] jinja version = 3.0.3 libyaml = True
安装并激活
python3-argcomplete
包以设置 Ansible bash 完成支持。$ sudo apt install python3-argcomplete $ sudo activate-global-python-argcomplete3
您现在可以按 Tab 键来获取 bash shell 的选项列表。
第 2 步 - 设置库存文件
为了能够连接到多个主机,您需要一个记录节点详细信息的文件。该文件称为清单文件。
根据您要控制的服务器数量,Ansibles Inventory 文件还允许您将它们安排在组和子组中。您还可以设置适用于选择主机或组的自定义变量,这些变量可以在传递说明时进一步使用。
Ansible 附带一个默认的 Inventory 文件,位于
/etc/ansible/hosts
。使用 Nano 编辑器打开它。$ sudo nano /etc/ansible/hosts
将以下代码粘贴到文件底部。
[servers] server1 ansible_host=203.0.113.111 server2 ansible_host=203.0.113.112 server3 ansible_host=203.0.113.113 [all:vars] ansible_python_interpreter=/usr/bin/python3
servers
部分定义了您要连接的节点列表。您可以创建尽可能多的组以将服务器安排在多个组中。all:vars
组在清单中的所有主机上设置ansible_python_interpreter
参数。它确保 Ansible 使用 Python 3 可执行文件而不是已从最近的 Ubuntu 版本中删除的 Python 2。完成后,按 Ctrl + X 并在提示确认更改时输入 Y 来保存文件。
注意:您还可以在您选择的任何位置创建您的清单文件,然后您可以在运行 Ansible 命令时使用
-i
参数传递该文件。您可以通过以下命令检查您的库存清单。
$ ansible-inventory --list -y all: children: servers: hosts: server1: ansible_host: 203.0.113.111 ansible_python_interpreter: /usr/bin/python3 server2: ansible_host: 203.0.113.112 ansible_python_interpreter: /usr/bin/python3 server3: ansible_host: 203.0.113.113 ansible_python_interpreter: /usr/bin/python3 ungrouped: {}
将服务器组织成组和子组
如果您有很多服务器,其中一些服务器执行特定功能,这是一个有用的提示。例如,您可以使用此方法将 Web 服务器和数据库服务器分开分组。您甚至可以使主机成为多个组的一部分。为此,您的清单文件应如下所示。
[webservers] 203.0.113.111 203.0.113.112 [dbservers] 203.0.113.113 server_hostname [development] 203.0.113.111 203.0.113.113 [production] 203.0.113.112 server_hostname
第 3 步 - 设置 SSH 密钥
为了让 Ansible 能够连接到服务器,您必须在 Ansible 服务器和清单文件中指定的主机之间配置 SSH 密钥。只有当 Ansible 客户端没有启用公钥并且启用了带密码的根帐户时,这才会起作用。
使用以下步骤为 Ansible 及其节点创建和设置 SSH 密钥。
为 Ansible 创建密钥。
$ ssh-keygen -t rsa -b 4096 -C "Ansible key"
将公钥复制到您在远程服务器上的帐户。为此,我们将使用
ssh-copy-id
命令。$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub
就这样。现在 Ansible 应该能够与您的服务器对话。
使用现有公钥在节点上设置 SSH 密钥
如果客户端已经启用了公钥,那么您将必须执行某些额外的步骤。为此,您需要在每个节点服务器上创建一个只能由 Ansible 访问的新用户。该用户将拥有无需密码即可访问的 sudo 权限,并且只能从您的 ansible 服务器访问。
要创建
ansible
用户,请运行以下命令。$ sudo adduser ansible
选择一个强密码并将所有其他字段留空。
现在,通过以下命令配置对此用户的无密码 sudo 访问。
$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible
现在,您已经添加并配置了新用户,您可以使用以下命令将 SSH 密钥从 ansible 服务器复制到节点服务器。
$ ssh-copy-id
系统将提示您输入 ansible 用户的密码。输入它,SSH 密钥将被复制。
接下来,为节点服务器上的
ansible
用户禁用基于密码的登录。$ sudo usermod -L ansible
现在,您的节点服务器只能从 Ansible 服务器访问,因为只有该服务器具有它的公钥,并且您不能直接在节点服务器上以 sudo 权限使用它,因为密码登录被禁用。
您将必须为每个节点服务器重复这些步骤。另外,将本教程中的
root
用户替换为ansible
用户。第 4 步 - 测试连接
设置清单文件和 SSH 密钥后,我们应该检查 Ansible 是否可以连接到服务器。
键入以下命令以检查连接。此命令将测试清单文件中与所有服务器的连接。
$ ansible all -m ping -u root
此命令使用 Ansibles ping 模块在所有服务器上运行连接测试。您应该得到如下所示的输出。
server1 | SUCCESS => { "changed": false, "ping": "pong" } server2 | SUCCESS => { "changed": false, "ping": "pong" } server3 | SUCCESS => { "changed": false, "ping": "pong" }
如果这是您第一次使用 Ansible,您将被要求确认所有服务器的真实性。出现提示时,键入
yes
并按ENTER
确认。第 5 步 - 运行一些基本命令
让我们使用 Ansible 在服务器上运行一些基本命令。要在服务器上运行任何命令,使用以下格式。
$ ansible all -a "command" -u <username>
检查磁盘使用情况
首先,让我们检查所有服务器上的磁盘使用情况。
$ ansible all -a "df -h" -u root server1 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on tmpfs 198M 972K 197M 1% /run /dev/sda2 50G 3.9G 44G 9% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 198M 4.0K 198M 1% /run/user/1000 server2 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on tmpfs 198M 922K 197M 1% /run /dev/sda2 50G 4.9G 43G 10% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 198M 4.0K 198M 1% /run/user/1000
定位单个主机和组
到目前为止,我们都是同时在所有远程服务器上运行命令。但情况并非总是如此。要仅在一台服务器上运行命令,您应该使用以下格式。
$ ansible server1 -a "uptime" -u root server1 | CHANGED | rc=0 >> 21:38:26 up 11 min, 2 users, load average: 0.00, 0.20, 0.19
上面的命令从清单组检查 server1 上的正常运行时间。
您还可以使用以下格式定位多个服务器。
$ ansible server1:server2 -m ping -u root
您还可以直接从清单文件中定位组或子组。
$ ansible groupname -m ping -u <username>
更新所有服务器
对于本教程,我们假设所有远程服务器都运行 Debian 或 Ubuntu 操作系统。
运行以下命令以更新所有服务器上的软件。
$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root
-m
参数定义 Ansible 运行的模块。-a
参数是指相关模块的参数或命令。在这里,我们使用 Ansible 的apt
模块来更新服务器,就像我们在上一个示例中使用ping
模块一样。update_cache
更新服务器上的 APT 缓存,upgrade=yes
告诉 Ansible 运行apt upgrade
命令。如果您使用上面记录的
ansible
用户,则需要修改ansible
命令以使用提升的 sudo 权限运行。$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible
此处,
-K
要求提供权限升级密码。-b
使用become
运行 ansible 操作,这允许您成为另一个用户。这两个变量结合起来允许 ansible 以提升的 sudo 权限运行。您需要将它用于所有需要 sudo 权限的命令。有时,其中一些更新命令可能需要重新启动,因此请运行以下命令以重新启动所有服务器。
$ ansible all -a "reboot" -u root
这些只是您可以使用 Ansible 运行的一些基本命令。
第 6 步 - 剧本简介
上述命令允许您运行一次性任务,但如果您想设置多台服务器或在多台服务器上运行相同的命令序列,则需要设置剧本。剧本是用 YAML 编写的文件,包含用于自动执行一系列任务以设置应用程序和服务的说明。
我们现在将创建一个剧本来安装 Nginx 并在 Ansible 节点上设置一个 HTML 页面。在您的主目录中为 Ansible 创建一个目录。
$ mkdir ~/ansible
创建并打开剧本文件进行编辑。
$ cd ~/ansible $ nano testplaybook.yml
剧本使用 YAML 格式来定义一个或多个剧本。一个 play 是一组有序的任务,以一种使过程自动化的方式排列。播放被定义为 YAML 列表。
定义播放的第一步是使用
hosts:all
指令确定哪些主机是目标。become
指令用于指示以下任务必须由超级用户执行。我们将定义三个任务:一个是添加用户,一个是升级所有包,最后一个是安装 Nginx 服务器。剧本的
vars
部分用于定义自定义变量。我们定义了两个变量,一个用于我们需要添加的用户,第二个用于定义我们需要安装的包的状态。要使用变量,我们需要将变量名括在双花括号中。ansible.builtin.user
模块用于添加具有 sudo 权限的新用户。要添加用户,我们使用name
、password
和group
变量。group
变量设置为sudo
以向用户授予超级用户权限。您不能将明文密码放在剧本文件中,因此,我们将添加一个 SHA 哈希密码。为此,我们将使用mkpasswd
实用程序。要安装它,请运行以下命令来安装whois
包。$ sudo apt install whois
生成哈希密码。系统将要求您提供常用密码,并为其提供一个散列字符串。记下要在剧本文件中使用的散列密钥。
$ mkpasswd --method=sha-512 Password: $6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1
update_cache
指令用于更新系统存储库列表,就像apt update
命令和upgrade: dist
指令告诉 Ansible 执行系统升级。第三个任务不言自明,即安装最新版本的 Nginx 服务器。根据我们讨论的信息,将以下代码粘贴到文件中。粘贴您获得的散列键作为
password
变量的值。--- - name: Test playbook hosts: all become: true vars: state: latest user: navjot tasks: - name: Add the user {{ user }} ansible.builtin.user: name: "{{ user }}" password: '$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1' group: sudo - name: Upgrade all apt packages apt: update_cache: yes upgrade: dist - name: Install the {{ state }} of package "nginx" apt: name: "nginx" state: "{{ state }}"
通过按 Ctrl + X 并在提示确认更改时输入 Y 来保存文件。
要执行剧本,请运行以下命令。
--ask-become-pass
标志将要求您提供 root 密码以执行提升的操作。$ ansible-playbook testplaybook.yml --ask-become-pass
您将获得以下输出。
BECOME password: PLAY [Test playbook] *************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************* ok: [server1] ok: [server2] ok: [server3] TASK [Add the user casablanca] ***************************************************************************************** changed: [server3] changed: [server2] changed: [server1] TASK [Upgrade all apt packages] **************************************************************************************** changed: [server1] changed: [server2] changed: [server3] TASK [Install the latest of package "nginx"] *************************************************************************** changed: [server3] changed: [server2] changed: [server1] PLAY RECAP ************************************************************************************************************* server1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server3 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这确认您的剧本已成功运行。
如果您使用的是自定义清单文件,则需要在命令中包含该文件的位置,如下所示。
$ ansible-playbook -i /etc/ansible/custominventory testplaybook.yml --ask-become-pass
结论
我们关于在 Ubuntu 22.04 服务器上安装和配置 Ansible 的教程到此结束。如果您有任何问题,请在下面的评论中发表。