Bootstrap

ansible官方文档翻译——ad-hoc命令篇

上篇(也不一定非要分个先后,只是上篇能让您快速上手):
ansible官方文档翻译-快速开始篇(基于rhel8系统,适用于centos)
原文链接:Introduction to ad hoc commands

ad hoc命令简介(临时命令)

ansible的ad hoc命令使用/usr/bin/ansible命令行工具在一个或多个受控节点上自动化一个任务。ad hoc命令简单方便,但是不可复用。所以我们为什么要先学习ad hoc命令呢?ad hoc命令展示了ansible的简洁与功能(原文为power,这里我个人认为翻译为功能最好)。您在这里学到的概念将会贯穿您学习ansible的始终,包括后面的playbook。在阅读与执行这些示例之前,请您先了解How to build your inventory(这个还没有开始翻译,等后面翻译了我会补上的)。

为什么要使用ad hoc命令?

ad hoc命令通常适用于您很少重复的任务。例如,在圣诞节那天您想要关闭您实验室内所有的电脑,您可以不用编写playbook,只执行一个单行的ansible命令。一个ad hoc命令通常像这样:

$ ansible [pattern] -m [module] -a "[module options]"

后面您将学到更多的pattern和module。(其实原文这里用了复数)

ad hoc命令的适用场景

ad hoc任务可以用来重启服务、复制文件、管理包和用户等。您可以在ad hoc任务中使用ansible模板。ad hoc任务和playbook都可以使用特定的模块执行直到到达某个特定状态。在开始执行之前ansible会检查目标是否已经达到了目标状态,如果没有才开始执行。

重启服务器

您可以使用ansible的模块,采用ad hoc的模式在10点的时候重启亚特兰大所有的web servers。在ansible执行这个之前,您必须在您的列表文件中把亚特兰大所有的servers放在[atlanta]的组中,同时必须要配置好您在那个组中的ssh权限。使用下面的命令来重启[atlanta]中的所有服务器:

$ ansible atlanta -a "/sbin/reboot"

默认情况下ansible可以同时执行5个进程。如果您有更多的主机,ansible也会与他们进行交互,但需要的时间会更长。如果要同时让十台主机重启,可以执行如下命令:

$ ansible atlanta -a "/sbin/reboot" -f 10"

/usr/bin/ansible将会默认使用您的用户名来执行命令,如果要使用其他用户连接:

$ ansible atlanta -a "/sbin/reboot" -f 10 -u username

正常地重启需要一定的权限,您可以使用become关键字来使用username用户来登陆但是以root身份来执行命令:

$ ansible atlanta -a "/sbin/reboot" -f 10 -u username --become [--ask-become-pass]

如果您添加了--ask-become-pass-K,那么ansible将会提示您输入密码来进行权限认证。

  • 注意:command模块并不支持额外的shell命令比如pip和重定向(即使环境变量依然起作用),如果您的命令要求shell语法,请您使用shell模块。在这个页面可以查看他们两个的更多不同。

到此为之我们所有的示例都采用了默认的command模块,如果您想使用别的模块,加上-m和模块名称。例如,使用ansible.builtin.shell模块:

$ ansible raleigh -m ansible.builtin.shell -a 'echo $TERM'

在使用ansible执行ad hoc命令时,请一定注意shell的引用规则,这样shell会保留本地的变量并将其传输给ansible。例如,在上面的例子中使用双引号将对其中的值进行求值。

管理文件

一个ad hoc命令可以利用ansible和scp的功能来传输多个文件到多台机器,下面的命令可以直接把一个文件传输到所有的[atlanta]组的节点中:

$ ansible atlanta -m ansible.builtin.copy -a "src=/etc/hosts dest=/tmp/hosts"

如果您想要重复一个这种的任务,请在playbook中使用 ansible.builtin.template模块。
ansible.builtin.file模块允许我们改变文件的权限与所有者。这些选项也可以直接传输给copy模块:

$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

file模块也可以用来创建目录,就类似mkdir -p命令:

$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

删除文件和文件夹一样:

$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c state=absent"

管理包

您可能也会使用ad hoc命令使用像yum的模块来在受控节点上安装、升级或者卸载包。如果想要在不执行安装的情况下确保某个包已经安装:

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=present"

可以这样来确认某个包的当前版本:

$ ansible webservers -m ansible.builtin.yum -a "name=acme-1.5 state=present"

可以这样确保某个包是最新的版本:

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=latest"

可以这样确保某个包没有被安装:

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=absent"

ansible有在不同操作系统下管理包的模块。如果没有管理您的包的模块,请您使用command模块或为您的包管理工具创建一个模块。

管理用户和组

您可以这样来确保一个服务在所有的webservers上已经开始运行了:

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=started"

也可以这样来在所有的webservers上重启某个服务:

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=restarted"

确保一个服务已经停止:

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=stopped"

收集facts

facts代表某个系统上的已发现的变量。您可以使用facts来实现有条件的任务,也可以获取到一个您系统当前的信息。如果您想要查看所有的facts:

$ ansible all -m ansible.builtin.setup

您也可以只显示特定的facts,您可以查看 ansible.builtin.setup模块的文档了解更多。
现在您已经了解了ansible执行的基础知识,接下来您可以继续学习可重复执行的自动化任务ansible playbook

;