介绍
Ansible 是一种现代配置管理工具,可简化设置和维护远程服务器的任务。凭借旨在让用户快速启动和运行的极简设计,它允许您使用剧本或临时命令从一个中心位置控制一到数百个系统。
与 playbook(由可重复使用的任务集合组成)不同,ad hoc 命令是您不经常执行的任务,例如重新启动服务或检索有关 Ansible 管理的远程系统的信息。
在本备忘单指南中,您将学习如何使用 Ansible 临时命令从 Ansible 控制节点执行常见任务,例如在一台或多台远程服务器上安装包、复制文件和重新启动服务。
先决条件
为了遵循本指南,您需要:
- 一个 Ansible 控制节点。本指南假设您的控制节点是一台安装了 Ansible 并配置为使用 SSH 密钥连接到您的 Ansible 主机的 Ubuntu 20.04 机器。确保控制节点有一个具有 sudo 权限的普通用户并启用了防火墙,如我们的初始服务器设置指南中所述。要设置 Ansible,请按照我们关于如何在 Ubuntu 20.04 上安装和配置 Ansible 的指南进行操作。
- 两个或更多 Ansible 主机。Ansible 主机是您的 Ansible 控制节点配置为自动化的任何机器。本指南假设您的 Ansible 主机是远程 Ubuntu 20.04 服务器。确保每个 Ansible 主机都具有:
- Ansible 控制节点的 SSH 公钥添加到
authorized_keys
系统用户的。该用户可以是 root 用户,也可以是具有 sudo 权限的普通用户。要进行设置,您可以按照如何在 Ubuntu 20.04 上设置 SSH 密钥的步骤 2 进行操作。
- Ansible 控制节点的 SSH 公钥添加到
- 在 Ansible 控制节点上设置的清单文件。确保您有一个包含所有 Ansible 主机的有效清单文件。要进行设置,请参阅有关如何设置 Ansible Inventories的指南。然后,通过运行测试与 Ansible 主机的连接部分中概述的连接测试,确保您能够连接到您的节点。
测试与 Ansible 主机的连接
以下命令将测试您的 Ansible 控制节点和所有 Ansible 主机之间的连接。该命令使用当前系统用户及其对应的 SSH 密钥作为远程登录,并包含-m
告诉 Ansible 运行ping
模块的选项。它还具有-i
标志,它告诉 Ansible ping 指定inventory
文件中列出的主机
- ansible all -i inventory -m ping
如果这是您第一次通过 SSH 连接到这些服务器,系统会要求您确认通过 Ansible 连接的主机的真实性。出现提示时,键入yes
然后点击ENTER
确认。
你应该得到类似这样的输出:
Outputserver1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
一旦您"pong"
从主机收到回复,就意味着连接处于活动状态,您已准备好在该服务器上运行 Ansible 命令。
调整连接选项
默认情况下,Ansible 尝试使用与当前系统用户同名的远程用户,使用其相应的 SSH 密钥对连接到节点。
要以不同的远程用户身份连接,请在命令后附加-u
标志和目标用户的名称:
- ansible all -i inventory -m ping -u sammy
如果您使用自定义 SSH 密钥连接到远程服务器,则可以在执行时使用以下--private-key
选项提供它:
- ansible all -i inventory -m ping --private-key=~/.ssh/custom_id
注意:有关如何连接节点的更多信息,请参阅我们的如何使用 Ansible指南,其中演示了更多连接选项。
一旦您能够使用适当的选项进行连接,您就可以调整您的清单文件以自动设置您的远程用户和私钥,以防它们与 Ansible 分配的默认值不同。然后,您不需要在命令行中提供这些参数。
以下示例清单文件ansible_user
仅为server1
服务器设置变量:
server1 ansible_host=203.0.113.111 ansible_user=sammy
server2 ansible_host=203.0.113.112
Ansible 现在将在连接到服务器时使用sammy作为默认远程用户server1
。
要设置自定义 SSH 密钥,请ansible_ssh_private_key_file
按如下方式包含变量:
server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id
server2 ansible_host=203.0.113.112
在这两种情况下,我们只为 设置了自定义值server1
。如果您想对多个服务器使用相同的设置,您可以为此使用子组:
[group_a]
203.0.113.111
203.0.113.112
[group_b]
203.0.113.113
[group_a:vars]
ansible_user=sammy
ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id
此示例配置将分配一个自定义用户和 SSH 密钥,仅用于连接到 中列出的服务器group_a
。
定义命令执行目标
使用 Ansible 运行临时命令时,您可以针对单个主机,以及组、主机和子组的任意组合。例如,这是您检查名为 的组中每个主机的连接性的方式servers
:
- ansible servers -i inventory -m ping
您还可以通过用冒号分隔来指定多个主机和组:
- ansible server1:server2:dbservers -i inventory -m ping
要在模式中包含异常,请使用感叹号,并以转义字符\
为前缀,如下所示。此命令将在来自 的所有服务器上运行group1
,除了server2
:
- ansible group1:\!server2 -i inventory -m ping
例如,如果您只想在同时包含group1
和 的服务器上运行命令group2
,则应&
改用。不要忘记用\
转义字符作为前缀:
- ansible group1:\&group2 -i inventory -m ping
有关在定义命令执行目标时如何使用模式的更多信息,请参阅我们关于如何设置 Ansible Inventories 指南的第 5 步。
运行 Ansible 模块
Ansible 模块是可以从 playbook 和命令行调用的代码片段,以促进在远程节点上执行过程。示例包括apt
用于在 Ubuntu 上管理系统包的user
模块和用于管理系统用户的模块。ping
本指南中使用的命令也是一个模块,通常用于测试从控制节点到主机的连接。
Ansible 附带了大量内置模块,其中一些需要安装额外的软件才能提供完整的功能。您还可以使用您选择的语言创建自己的自定义模块。
要执行参数的模块,请包括-a
标志,然后是双引号中的相应选项,如下所示:
ansible target -i inventory -m module -a "module options"
例如,这将使用apt
模块将软件包安装tree
在server1
:
- ansible server1 -i inventory -m apt -a "name=tree"
运行 Bash 命令
当没有通过-m
选项提供模块时,默认情况下使用命令模块在远程服务器上执行指定的命令。
这使您几乎可以执行通常可以通过 SSH 终端执行的任何命令,只要连接用户具有足够的权限并且没有任何交互式提示。
此示例uptime
在指定清单中的所有服务器上执行命令:
- ansible all -i inventory -a "uptime"
Outputserver1 | CHANGED | rc=0 >>
14:12:18 up 55 days, 2:15, 1 user, load average: 0.03, 0.01, 0.00
server2 | CHANGED | rc=0 >>
14:12:19 up 10 days, 6:38, 1 user, load average: 0.01, 0.02, 0.00
使用权限提升来运行命令 sudo
如果要在远程主机上执行的命令或模块需要扩展系统权限或不同的系统用户,则需要使用 Ansible 的权限提升模块, 成为. 该模块是对sudo
Ansible 在不同操作系统上支持的以及其他权限提升软件的抽象。
例如,如果您想tail
在名为server1
from的服务器上运行命令以从 Nginx 的错误日志中输出最新的日志消息inventory
,则需要包含--become
如下选项:
- ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become
这相当于sudo tail /var/log/nginx/error.log
在远程主机上运行命令,使用当前本地系统用户或在您的清单文件中设置的远程用户。
权限提升系统(例如)sudo
通常要求您通过提示您提供用户密码来确认您的凭据。这将导致 Ansible 无法执行命令或剧本。然后,您可以使用--ask-become-pass
或-K
选项让 Ansible 提示您输入该sudo
密码:
- ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become -K
安装和删除软件包
以下示例使用该apt
模块nginx
在提供的清单文件中的所有节点上安装包:
- ansible all -i inventory -m apt -a "name=nginx" --become -K
要删除包,请包含state
参数并将其设置为absent
:。
- ansible all -i inventory -m apt -a "name=nginx state=absent" --become -K
复制文件
使用该file
模块,您可以在控制节点和受管节点之间以任一方向复制文件。以下命令将本地文本文件复制到指定清单文件中的所有远程主机:
- ansible all -i inventory -m copy -a "src=./file.txt dest=~/myfile.txt"
要将文件从远程服务器复制到您的控制节点,请包括以下remote_src
选项:
- ansible all -i inventory -m copy -a "src=~/myfile.txt remote_src=yes dest=./file.txt"
更改文件权限
要修改远程节点上文件和目录的权限,您可以使用该file
模块。
以下命令将调整远程主机上名为file.txt
at的文件的权限/var/www
。它将文件的umask设置为600
,这将仅为当前文件所有者启用读写权限。此外,它将将该文件的所有权设置为一个用户和一个名为 的组sammy
:
- ansible all -i inventory -m file -a "dest=/var/www/file.txt mode=600 owner=sammy group=sammy" --become -K
由于该文件位于通常由 拥有的目录中root
,我们可能需要sudo
修改其属性的权限。这就是我们包含--become
和-K
选项的原因。这些将使用Ansible 的权限提升系统以扩展权限运行命令,并提示您提供sudo
远程用户的密码。
重启服务
您可以使用该service
模块来管理在 Ansible 管理的远程节点上运行的服务。这将需要扩展系统权限,因此请确保您的远程用户具有 sudo 权限,并且您可以--become
选择使用 Ansible 的权限提升系统。使用-K
将提示您提供sudo
连接用户的密码。
例如,要nginx
在名为 的组中的所有主机上重新启动服务webservers
,您可以运行:
- ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become -K
重启服务器
尽管 Ansible 没有专门的模块来重新启动服务器,但您可以发出一个 bash 命令来调用/sbin/reboot
远程主机上的命令。
重新启动服务器将需要扩展系统权限,因此请确保您的远程用户具有 sudo 权限,并且您可以--become
选择使用 Ansible 的权限提升系统。使用-K
将提示您提供sudo
连接用户的密码。
警告:以下命令将完全重新启动 Ansible 所针对的服务器。这可能会导致依赖这些服务器的任何应用程序暂时中断。
webservers
例如,要重新启动组中的所有服务器,您可以运行:
- ansible webservers -i inventory -a "/sbin/reboot" --become -K
收集有关远程节点的信息
该setup
模块返回有关 Ansible 管理的远程系统的详细信息,也称为系统事实。
要获取 的系统事实server1
,请运行:
- ansible server1 -i inventory -m setup
这将打印大量 JSON 数据,其中包含有关远程服务器环境的详细信息。要仅打印最相关的信息,请包含"gather_subset=min"
如下参数:
- ansible server1 -i inventory -m setup -a "gather_subset=min"
要仅打印 JSON 的特定项目,您可以使用该filter
参数。这将接受用于匹配字符串的通配符模式,类似于fnmatch
. 例如,要获取有关 ipv4 和 ipv6 网络接口的信息,您可以将其*ipv*
用作过滤器:
- ansible server1 -i inventory -m setup -a "filter=*ipv*"
Outputserver1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"203.0.113.111",
"10.0.0.1"
],
"ansible_all_ipv6_addresses": [
"fe80::a4f5:16ff:fe75:e758"
],
"ansible_default_ipv4": {
"address": "203.0.113.111",
"alias": "eth0",
"broadcast": "203.0.113.111",
"gateway": "203.0.113.1",
"interface": "eth0",
"macaddress": "a6:f5:16:75:e7:58",
"mtu": 1500,
"netmask": "255.255.240.0",
"network": "203.0.113.0",
"type": "ether"
},
"ansible_default_ipv6": {}
},
"changed": false
}
如果您想检查磁盘使用情况,可以运行 Bash 命令调用该df
实用程序,如下所示:
- ansible all -i inventory -a "df -h"
Output
server1 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 798M 624K 798M 1% /run
/dev/vda1 155G 2.3G 153G 2% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 798M 0 798M 0% /run/user/0
server2 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 395M 608K 394M 1% /run
/dev/vda1 78G 2.2G 76G 3% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 395M 0 395M 0% /run/user/0
结论
在本指南中,我们演示了如何使用 Ansible ad hoc 命令管理远程服务器,包括如何执行常见任务,例如重新启动服务或将文件从控制节点复制到 Ansible 管理的远程服务器。我们还看到了如何使用限制和过滤参数从远程节点收集信息。
作为附加资源,您可以查看 Ansible 的关于临时命令的官方文档。