这是Ansible系列课程第三节,Ansible Ad-hoc命令介绍。介绍一下ad-hoc命令是什么,以及几个具体的实例。
该系列课程前后章节都是有关联性的,对于初学者建议按顺序阅读。也可以选择特定的章节了解单个知识点。
上一节我们完成了Ansible的基础环境搭建,并且成功执行了第一条ad-hoc命令。正所谓“麻雀虽小五脏俱全”,ad-hoc命令虽然简单但也是一次完整的ansible任务,对于了解Ansible以及Ansible playbook的使用也很有帮助。这一节主要介绍一下什么是ad-hoc命令,有什么用处并且列举几个常见的使用场景。
什么是ad-hoc命令
ad-hoc命令是指使用/usr/bin/ansible命令行工具在一个或多个管理节点上执行单个任务的命令。这其实是一个概念性的名字,是相对于 Ansible playbook 来说的。当我们需要快速的完成一些任务而不需要将执行的命令保存下来,这样的命令就称为ad-hoc命令。
Ansible提供两种方式去执行任务:一种是ad-hoc 命令,另一种是写 Ansible playbook。前者可以处理一些简单的任务,而后者需要处理比较复杂的任务。ad-hoc命令与playbook的关系类似于在命令行敲入的shell命令和shell scripts之间的关系。
ad-hoc命令虽然简单,但也展示出了Ansible的强大功能,并且也有很多使用场景,比如在多个远程主机上快速执行一次性的任务,或者想测试某个模块的行为以决定是否要加入到playbook中等等。
单个ad-hoc命令介绍
下面介绍一下ad-hoc命令如何使用,ad-hoc命令的格式如下:
$ ansible[pattern]-m[module]-a"[module options]"
举个例子:
$ ansibledevops-mfile-a"path=/mnt/1.txt state=touch"
这个格式包含四个主要部分:
ansible:ad-hoc命令是通过ansible执行的,类似于ansible-playbook执行playbook脚本。
pattern:指定该命令要在哪些管理节点或者哪组管理节点上执行,比如例子中的devops主机组。选择管理节点或者主机组的方式有很多种,在后面章节会有介绍。
-m [module]:指定该命令要执行哪个模块,比如例子中的file模块。ansible中自带许多模块,通过命令或playbook在远程管理节点上执行。
-a [module options]:指定该模块执行时所需要的选项,比如例子中的"path=/mnt/1.txt state=touch"。每个模块都包含很多功能,通过传入不同的选项执行具体的操作。
例子的含义就是:在devops主机组中通过file模块创建一个路径为/mnt/1.txt的文件。
上面格式只列出里ansible命令的几个参数,其他的更多参数可以通过执行ansible --help命令查看。
[root@controll-node ~]# ansible --help
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
[-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
[--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
[-c CONNECTION] [-T TIMEOUT]
[--ssh-common-args SSH_COMMON_ARGS]
[--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS]
[--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass |--vault-password-fileVAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[-a MODULE_ARGS] [-m MODULE_NAME]
pattern
Define and run a single task'playbook'against asetof hosts
positional arguments:
pattern host pattern
......
默认模块command
ansible中的模块很多,这里只说一下command模块,因为他是ansible命令行工具的默认模块,也就是说,在执行ansible命令时,可以不用传入-m参数指定模块名。比如:
#将devops主机组的服务器重启
$ ansibledevops-a"/sbin/reboot"
command模块的功能是有限的,该模块不支持shell语法,比如管道符、重定向、$PATH、$HOME变量等。如果我们的命令里需要使用shell语法,就要使用shell模块,这里要注意的是选项里单引号的用法(单引号获取的是管理节点的变量,双引号获取的是控制节点的变量)。从下面示例中也可以看出。
#这里获取的是管理节点的变量
[root@controll-node ~]# ansible devops -m shell -a 'echo $HOSTNAME'
118.195.199.238 | CHANGED |rc=0>>
manage-node
#这里获取的是控制节点的变量
[root@controll-node ~]# ansible devops -m shell -a "echo $HOSTNAME"
118.195.199.238 | CHANGED |rc=0>>
controll-node
举几个具体的实例
①管理组和用户
利用group模块管理用户组,包括创建、删除用户组,通过下面的命令创建devops用户组:
$ ansibledevops-mgroup-a"name=devops state=present"
利用user模块管理用户,包括创建、删除和修改用户属性等,通过下面命令创建用户devops,并将其添加到devops组中。
$ ansibledevops-muser-a'name=devops password=$6$.evG1Z/VuVrACjw.$ZrxtGWn3NCaFNGbR3195bEQgU5insiI1.H/0Sho/iIl2o1kcGka04bDA.rUPtd0pIHhfxnunAIeotzYynEqSs1 groups=devops'
②管理文件
可以利用file模块管理文件、目录和链接,包括创建、删除和修改属性。下面通过ad-hoc命令在devops主机组创建一个文件,命令如下:
$ ansibledevops-mfile-a"path=/mnt/1.txt state=touch"
从结果可以看出文件创建成功了。默认情况下,ansible使用的是当前登录用户,那么如何用另一个用户执行该任务呢?ansible提供了-u选项指定用户。假如我们想用devops账号创建该文件呢,命令如下:
$ ansibledevops-mfile-a"path=/mnt/2.txt state=touch"-u devops
结果失败了,从错误信息里可以看出是没有在/mnt下创建文件的权限,下面我们使用sudo创建文件。注意:请确保devops用户在sudo的组里,如果没有,将其添加到/etc/sudoers文件中,可使用visudo命令添加。在ansible中使用--become选项来使用sudo。
$ ansibledevops-mfile-a"path=/mnt/2.txt state=touch"-u devops --become
结果又失败了,从错误信息可以看出是缺少sudo的密码。ansible提供了--ask-become-pass选项输入sudo的密码。
$ ansibledevops-mfile-a"path=/mnt/2.txt state=touch"-u devops --become --ask-become-pass
输入sudo密码后,这次终于成功了。
③管理软件
有时候需要在管理节点上安装软件,比如安装Git,就可以利用Linux的包管理器模块进行安装,CentOS平台是yum模块,可以通过下面的命令进行安装:
$ ansibledevops-myum-a"name=git state=present"
如果要卸载软件,只需要修改参数中的state值为absent即可,完整命令如下:
$ ansibledevops-myum-a"name=git state=absent"
好了,ad-hoc命令的使用场景先介绍到这里,更详细的用法可以在模块介绍里面查找。
总结
这一节介绍了ad-hoc命令的用法并通过几个例子介绍了几个常用的使用场景。可以看出,ad-hoc命令就是一条简单而具体的任务,既不能保存命令也不能存储结果,复杂的业务逻辑更是处理不了。而这些就需要ansible另一个强大的功能playbook完成的,并且在使用Ansible过程中基本上就是编写playbook来处理复杂的场景。下一节详细介绍一下inventory,看看如何更好的管理主机。
网友评论