这是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的强大功能,并且也有很多使用场景,比如在多个远程主机上快速执行一次性的任务,或者想测试某个??榈男形跃龆ㄊ欠褚尤氲絧laybook中等等。
单个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中的??楹芏啵饫镏凰狄幌耤ommand???,因为他是ansible命令行工具的默认模块,也就是说,在执行ansible命令时,可以不用传入-m参数指定??槊?。比如:
#将devops主机组的服务器重启
$ ansibledevops-a"/sbin/reboot"
command??榈墓δ苁怯邢薜模媚?椴恢С謘hell语法,比如管道符、重定向、$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命令的使用场景先介绍到这里,更详细的用法可以在??榻樯芾锩娌檎摇?/p>
总结
这一节介绍了ad-hoc命令的用法并通过几个例子介绍了几个常用的使用场景??梢钥闯觯琣d-hoc命令就是一条简单而具体的任务,既不能保存命令也不能存储结果,复杂的业务逻辑更是处理不了。而这些就需要ansible另一个强大的功能playbook完成的,并且在使用Ansible过程中基本上就是编写playbook来处理复杂的场景。下一节详细介绍一下inventory,看看如何更好的管理主机。