如何使用 Ansible 临时命令管理多个服务器

介绍

Ansible是一款现代化的配置管理工具,可简化设置和维护远程服务器的任务,旨在让用户快速启动和运行,它允许您从一个中心位置控制一到数百个系统,使用播放簿或特例命令。

与可重复使用的任务集构成的玩本不同,Ad hoc命令是您不经常执行的任务,例如重新启动服务或获取Ansible管理的远程系统信息。

在此 cheat sheet 指南中,您将学习如何使用 Ansible 临时命令执行常见任务,如安装包、复制文件和从 Ansible 控制节点重新启动一个或多个远程服务器上的服务。

前提条件

为了遵循这个指南,你需要:

  • ** 一个可逆控制节点**。 本指南假定您控制节点是一台Ubuntu 20.04机,安装并配置了Ansible,以便使用SSH密钥连接您的Ansible主机. 如我们初始服务器设置指南所解释的,确保控制节点有一个具有sudo权限的正则用户并启用了防火墙. 要设置Ansible,请遵循我们的指南:[如何在Ubuntu 20.04上安装和配置Ansible (https://andsky.com/tech/tutorials/how-to-install-and-configure-ansible-on-ubuntu-20-04).
  • 两个或两个以上Ansible主机. Ansible 主机是任何配置到自动化的Ansible控制节点的机器. 本指南假设您的 Ansible 主机是远程 Ubuntu 20.04 服务器 。 确保每个 Ansible 主机有:
  • Ansible Control node的SSH公钥添加到系统用户的 " 授权的_ keys " 中. 这个用户可以是root,也可以是拥有sudo权限的正则用户. 要设置此功能,您可以跟随[Ubuntu 20.04上如何设置SSH密钥的第2步 (https://andsky.com/tech/tutorials/how-to-set-up-ssh-keys-on-ubuntu-20-04).

测试与 Ansible 主机的连接

以下命令将测试您的Ansible控制节点与所有Ansible主机之间的连接性。该命令将使用当前系统用户及其相应的SSH密钥作为远程登录,并包含m选项,该选项告诉Ansible运行ping模块。

1ansible all -i inventory -m ping

如果这是您第一次通过 SSH 连接到这些服务器,您将被要求确认您通过 Ansible 连接的主机的真实性。

你应该得到类似于此的输出:

1[secondary_label Output]
2server1 | SUCCESS => {
3    "changed": false, 
4    "ping": "pong"
5}
6server2 | SUCCESS => {
7    "changed": false, 
8    "ping": "pong"
9}

一旦您收到来自主机的pong响应,这意味着连接是活跃的,您已经准备好在该服务器上运行 Ansible 命令。

调整连接选项

默认情况下,Ansible 试图以与当前系统用户相同的名称连接到节点,使用相应的 SSH 键对。

若要作为不同的远程用户进行连接,请附上-u旗和预定用户的名称的命令:

1ansible all -i inventory -m ping -u sammy

如果您正在使用自定义 SSH 密钥连接到远程服务器,则可以在执行时提供--private-key选项:

1ansible all -i inventory -m ping --private-key=~/.ssh/custom_id

<$>[注] :有关如何连接到节点的更多信息,请参阅我们的 如何使用 Ansible指南,其中展示了更多的连接选项。

一旦您能够使用相应的选项连接,您可以调整库存文件以自动设置远程用户和私钥,如果它们与Ansible分配的默认值不同。

以下示例库存文件仅为server1服务器设置了ansible_user变量:

1[label ~/ansible/inventory]
2server1 ansible_host=203.0.113.111 ansible_user=sammy
3server2 ansible_host=203.0.113.112

Ansible 现在将使用 sammy作为默认的远程用户,当连接到server1服务器时。

若要设置自定义 SSH 密钥,请包括以下ansible_ssh_private_key_file变量:

1[label  ~/ansible/inventory]
2server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id
3server2 ansible_host=203.0.113.112

在这两种情况下,我们只为server1设置了自定义值,如果你想在多个服务器上使用相同的设置,你可以使用一个小组:

 1[label ~/ansible/inventory]
 2[group_a]
 3203.0.113.111
 4203.0.113.112
 5
 6[group_b]
 7203.0.113.113
 8
 9[group_a:vars]
10ansible_user=sammy
11ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id

此示例配置只会分配一个自定义用户和SSH密钥,以便连接到group_a中列出的服务器。

定义命令执行的目标

使用 Ansible 运行临时命令时,您可以针对单个主机,以及组、主机和子组的任何组合,例如,以下是如何检查名为服务器组中的每个主机的连接:

1ansible servers -i inventory -m ping

您还可以通过将它们与列分开来指定多个主机和组:

1ansible server1:server2:dbservers -i inventory -m ping

若要在模式中包含一个例外,请使用一个叫声标记,前缀为逃避字符 \,如下所示. 此命令将在 group1 的所有服务器上运行,除了 server2:

1ansible group1:\!server2 -i inventory -m ping

例如,如果您只想在「group1」和「group2」的服务器上运行一个命令,则应该使用「&」代替它。

1ansible group1:\&group2 -i inventory -m ping

有关如何在定义命令执行目标时使用模式的更多信息,请参阅 如何设置可理解库存指南的第 5 步

可运行模块

Ansible模块是可以从播放簿和命令行调用的代码,以便在远程节点上执行程序。示例包括apt模块,用于在Ubuntu上管理系统包,以及user模块,用于管理系统用户。

Ansible 船舶具有广泛的内置模块集合,其中一些需要安装额外的软件以提供完整的功能。

若要运行具有参数的模块,请包括-a标志,然后在双引文中添加相应的选项,如下:

1ansible target -i inventory -m module -a "module options"

例如,这将使用apt模块在server1上安装包tree:

1ansible server1 -i inventory -m apt -a "name=tree"

运行 Bash 命令

当一个模块不通过 -m 选项提供时,默认情况下,使用 command模块在远程服务器(s)上执行指定的命令。

这允许您通过SSH终端执行几乎任何可以正常执行的命令,只要连接用户有足够的权限,并且没有交互式提示。

此示例在指定的库存中的所有服务器上执行uptime命令:

1ansible all -i inventory -a "uptime"
1[secondary_label Output]
2server1 | CHANGED | rc=0 >>
3 14:12:18 up 55 days, 2:15, 1 user, load average: 0.03, 0.01, 0.00
4server2 | CHANGED | rc=0 >>
5 14:12:19 up 10 days, 6:38, 1 user, load average: 0.01, 0.02, 0.00

使用特权升级执行sudo命令

如果您想在远程主机上执行的命令或模块需要扩展系统权限或不同的系统用户,则需要使用Ansible的特权升级模块 _become。

例如,如果您想运行一个尾巴命令,从库存server1服务器上输出 Nginx 错误日志的最新日志消息,则需要包括--become选项如下:

1ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become

这相当于在远程主机上运行一个sudo tail /var/log/nginx/error.log命令,使用当前的本地系统用户或在库存文件中设置的远程用户。

诸如sudo等特权升级系统通常要求您通过提示您提供用户密码来确认您的身份证件,这会导致 Ansible 无法执行命令或播放簿。

1ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become -K

安装和删除包裹

下面的示例使用apt模块在提供的库存文件中的所有节点上安装nginx包:

1ansible all -i inventory -m apt -a "name=nginx" --become -K

要删除一个包,包括状态参数并将其设置为缺席:

1ansible all -i inventory -m apt -a "name=nginx state=absent" --become  -K

复制文件

使用文件模块,您可以将文件复制到控制节点和管理节点之间,以任何方向。

1ansible all -i inventory -m copy -a "src=./file.txt dest=~/myfile.txt"

要将文件从远程服务器复制到控制节点,请包括remote_src选项:

1ansible all -i inventory -m copy -a "src=~/myfile.txt remote_src=yes dest=./file.txt"

更改檔案許可

要修改远程节点上的文件和目录的权限,您可以使用文件模块。

下列命令会调整位于远程主机的 /var/www 位置的名为 file.txt’ 的文件的权限,将该文件的 umask 设置为 `600',这将只允许当前文件所有者阅读和写入权限。

1ansible all -i inventory -m file -a "dest=/var/www/file.txt mode=600 owner=sammy group=sammy" --become  -K

由于该文件位于一个通常由root拥有的目录中,我们可能需要sudo权限来修改其属性,这就是为什么我们包括了--become-K选项,这些选项将使用Ansible’s privilege escalation system()来运行扩展权限的命令,并要求您为远程用户提供sudo密码。

重启服务

您可以使用服务模块来管理由 Ansible 管理的远程节点上运行的服务,这将需要扩展系统权限,因此请确保您的远程用户具有 sudo 权限,并且您包括使用 Ansible 权限升级系统的 `-- Become 选项。

例如,要在组中的所有主机上重新启动nginx服务,称为Web服务器,你会运行:

1ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become  -K

重新启动服务器

虽然 Ansible 没有专用模块来重新启动服务器,但您可以发出一个 bash 命令,该命令在远程主机上调用 /sbin/reboot 命令。

重新启动服务器将需要扩展的系统权限,所以请确保您的远程用户具有 sudo 权限,并将 `-- Become' 选项包含在 Ansible 的权限升级系统中。

<$>[警告] 警告:下列命令将完全重新启动Ansible针对的服务器(服务器)。

例如,要重新启动一个Web服务器组中的所有服务器,您将运行:

1ansible webservers -i inventory -a "/sbin/reboot"  --become  -K

收集有关远程节点的信息

设置模块返回了Ansible管理的远程系统的详细信息,也称为 _system facts。

要获取server1的系统事实,运行:

1ansible server1 -i inventory -m setup

这将打印大量的 JSON 数据,其中包含有关远程服务器环境的详细信息。

1ansible server1 -i inventory -m setup -a "gather_subset=min"

若要打印 JSON 中的特定项目,您可以使用过滤器参数,这将接受用于匹配字符串的野卡模式,类似于 fnmatch

1ansible server1 -i inventory -m setup -a "filter=*ipv*"
 1[secondary_label Output]
 2server1 | SUCCESS => {
 3    "ansible_facts": {
 4        "ansible_all_ipv4_addresses": [
 5            "203.0.113.111", 
 6            "10.0.0.1"
 7        ], 
 8        "ansible_all_ipv6_addresses": [
 9            "fe80::a4f5:16ff:fe75:e758"
10        ], 
11        "ansible_default_ipv4": {
12            "address": "203.0.113.111", 
13            "alias": "eth0", 
14            "broadcast": "203.0.113.111", 
15            "gateway": "203.0.113.1", 
16            "interface": "eth0", 
17            "macaddress": "a6:f5:16:75:e7:58", 
18            "mtu": 1500, 
19            "netmask": "255.255.240.0", 
20            "network": "203.0.113.0", 
21            "type": "ether"
22        }, 
23        "ansible_default_ipv6": {}
24    }, 
25    "changed": false
26}

如果你想检查磁盘使用率,你可以运行一个Bash命令调用df实用程序,如下:

1ansible all -i inventory -a "df -h"
 1[secondary_label Output]
 2
 3server1 | CHANGED | rc=0 >>
 4Filesystem Size Used Avail Use% Mounted on
 5udev 3.9G 0 3.9G 0% /dev
 6tmpfs 798M 624K 798M 1% /run
 7/dev/vda1 155G 2.3G 153G 2% /
 8tmpfs 3.9G 0 3.9G 0% /dev/shm
 9tmpfs 5.0M 0 5.0M 0% /run/lock
10tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
11/dev/vda15 105M 3.6M 101M 4% /boot/efi
12tmpfs 798M 0 798M 0% /run/user/0
13
14server2 | CHANGED | rc=0 >>
15Filesystem Size Used Avail Use% Mounted on
16udev 2.0G 0 2.0G 0% /dev
17tmpfs 395M 608K 394M 1% /run
18/dev/vda1 78G 2.2G 76G 3% /
19tmpfs 2.0G 0 2.0G 0% /dev/shm
20tmpfs 5.0M 0 5.0M 0% /run/lock
21tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
22/dev/vda15 105M 3.6M 101M 4% /boot/efi
23tmpfs 395M 0 395M 0% /run/user/0

结论

在本指南中,我们展示了如何使用 Ansible 临时命令来管理远程服务器,包括如何执行常见任务,例如重新启动服务或从控制节点复制文件到由 Ansible 管理的远程服务器。

作为一个额外的资源,您可以检查Ansible的 官方文档在专用命令。

Published At
Categories with 技术
comments powered by Disqus