为了运行Ansible的第一个命令,我们前期做了大量的配置工作, 在controller主机和各个node主机上。为什么这么做,就是为了能够直接使用ansible,远程指挥一堆一堆的服务器,copy文件,安装软件包,更新软件,更改配置文件等等等等。。。
如果你查看了ansible官方文档,人家也是要让你从最最基础的命令开始,就像你学任何编程语言,第一个例子永远都是打印一句:hello world!
对于ansible而言,我查了一些教程,也听同事介绍过,那第一条命令就是ping。要想使用任何工具,那第一个动作就是要查看一下help,就是看看使用说明书,以确保你的打开姿势是正确的。
输入:ansible --help,就会出来很多信息,主要看Usage这一行,其实这个usage个人觉得写的不是太好,如果有个实例就更完美了。
针对ansible的参数,简单的说明一下 吧,也参考了网上的说明
ansible -h 参数解析
Usage: ansible <host-pattern> [options]
Options:
** -a MODULE_ARGS, --args=MODULE_ARGS 下面-m模块的参数,这个参数很重要,这个参数很重要,这个参数很重要!重要的事情说三遍。如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等**
-k, --ask-pass ask for SSH password 登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass ask for su password su切换密码
-K, --ask-sudo-pass ask for sudo password 提示密码使用sudo,sudo表示提权操作
--ask-vault-pass ask for vault password
-B SECONDS, --background=SECONDS 后台运行超时时间
run asynchronously, failing after X seconds
(default=N/A)
-C, --check don‘t make any changes; instead, try to predict some
只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
of the changes that may occur
-c CONNECTION, --connection=CONNECTION 连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。
connection type to use (default=smart)
-f FORKS, --forks=FORKS 并行任务数。NUM被指定为一个整数,默认是5
specify number of parallel processes to use
(default=5)
-h, --help show this help message and exit 打开帮助文档API
-i INVENTORY, --inventory-file=INVENTORY 指定库存主机文件的路径,默认为/etc/ansible/hosts
specify inventory host file
(default=/etc/ansible/hosts)
-l SUBSET, --limit=SUBSET 进一步限制所选主机/组模式 --limit=192.168.91.135 只对这个ip执行
further limit selected hosts to an additional pattern
--list-hosts outputs a list of matching hosts; does not execute
anything else
** -m MODULE_NAME, --module-name=MODULE_NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数。这个参数很重要,这个参数很重要!重要的事情说三遍。**
module name to execute (default=command)
-M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/
specify path(s) to module library
(default=/usr/share/ansible/)
-o, --one-line condense output 压缩输出,摘要输出.尝试一切都在一行上输出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL 调查背景工作每隔数秒。需要- b
set the poll interval if using -B (default=15)
--private-key=PRIVATE_KEY_FILE 私钥路径,使用这个文件来验证连接
use this file to authenticate the connection
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用户,默认是root用户
run operations with su as this user (default=root)
-s, --sudo run operations with sudo (nopasswd)
-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪个用户,默认为 root
desired sudo user (default=root)
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默认超时时间, 默认是10S
override the SSH timeout in seconds (default=10)
-t TREE, --tree=TREE log output to this directory 将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
-u REMOTE_USER, --user=REMOTE_USER 远程用户, 默认是root用户
connect as this user (default=root)
--vault-password-file=VAULT_PASSWORD_FILE
vault password file
-v, --verbose verbose mode (-vvv for more, -vvvv to enable 如果命令执行成功,输出详细的结果。输出执行过程的详细信息:-v<-vv<-vvv<-vvvv,单间的说就是v越多,输出的信息就越详细。
connection debugging)(
-
vv –vvv
-
vvvv)
--version show program‘s version number and exit 输出ansible的版本
好了,上面的帮助信息,看看就好,知道大概怎么用了,但是还不够具体。要想运行ansible命令,还有一个前提条件,就是要把受控的主机,加到ansible的hosts文件里,这样ansible才知道它受控的主机有哪些。hosts文件路径在:/etc/ansible/hosts下。我们来cat一下,看看里面的内容:
如上图所示,这个hosts文件里已经给出了3个例子,怎么写受控主机你应该知道了吧。
第一种:简单粗暴,直接写受控主机的hostname或者IP地址。
第二种和第三种:类似,都是以分组的方式——[组名],这个组名就是可以跟在ansible命令行后的。所以,可以这么理解:
- ansible命令后面必须要跟目标主机
- 这个目标主机的写法有多种,可以是目标主机的hostname,也可以是IP,也可以是你定义在ansible hosts文件里的组名。
- 但是无论是什么名字,那都要加入到ansible的hosts文件里,否则是没用的,ansible是不识别的。所以这个hosts文件,是ansile的仓库,你让ansible做什么事情,它得先找到目标,那它每次都是先去这个仓库里找目标,然后再下手。
所以我现在先用简单第一种简单粗暴的方式,把node1,node2和node3都加进去,而且只加他们的主机名,更改之后保存,退出。
由于我们没有分组,所以直接执行下面的命令:
ansible node1 -m ping
ansible:命令关键字,必须要有
node1:就是你要远程控制的主机名称,这里也可以使用IP地址,效果相同
-m:这个就是指你想用ansible的哪个模块,后面跟上就行,现在这个 例子是用ping的模块。注意这个是Linux上面的ping模块,如果目前主机是Windows,是有一个Win_ping对应的模块。最好带上吧!如果不带这个-m参数,默认是使用command这个模块。
以上就是一个最简单的ansible ad-hoc命令了。
下面我们在执行ansible命令时,把node1这个主机名称,换成IP地址看看:
从上图可以看到,是不行滴。为什么呢?回顾一下ansible执行的过程,它会先去仓库里找目标啊,很显然,我们没有 把这个IP地址加入到hosts这个仓库里,它当然就找不到了。那我们现在把这个IP地址加入进去,然后再运行一下:ansible 192.168.137.101 -m ping,看看会不会报错。
加入IP地址到ansible hosts文件中:
再运行命令:ansible 192.168.137.101 -m ping
完美,你发起了ping,它给你个pong。没毛病。
那现在我们用第二、第三种方法,把不同的server,分成不同的组。
假如node1和node2是web服务器,那我就把这两台主机放到[webservers]组,那node3就当做database服务器吧,放到[dbservers]
调整ansible的hosts文件如下:
注意一下,我在[dbservers]这个组下,放了node3主机名和node1的IP地址。
让我们来ansible一下,对象是我们新建的组,先来webservers组吧:
两个ping,连个pong,都显示SUCCESS,没毛病。
那我们再来看看dbservers这个组,因为这个组里包含了主机名和主机IP地址两种格式:
如上图所示,两个ping,连个pong,都显示SUCCESS,没毛病。
好了,这个就先扯到这里吧!下篇再加个参数,你猜是哪个?
原文地址:https://blog.51cto.com/jiaszwx/2412118