本节书摘来自华章出版社《ansible权威指南》一书中的第2章,第2.3节,作者 李松涛 魏 巍 甘 捷 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.3 ansible命令用法详解
ansible命令行执行方式有ad-hoc、ansible-playbook两种方式,web化执行方式其官方提供了付费产品tower(10台以内免费),个人的话可以基于其提供的api开发类似的web化产品。关于命令行执行的两种方式ad-hoc和ansible-playbooks、什么是ad-hoc及ad-hoc与ansible-playbook的区别我们在第3章有详细介绍,这里不再赘述。需简要说明的是两者没有本质上的区别,ad-hoc主要用于临时命令的执行,ansibel-playbook可以理解为ad-hoc的集合,通过一定的规则编排在一起。两者的操作也极其简便,且提供了如with_items、failed_when、changed_when、until、ignore_errors等丰富的逻辑条件和dry-run的check mode。但在chceck mode下并不真正执行命令,即将执行的操作不会对端服务器产生任何影响,只模拟命令的执行过程是否能正常执行。
通过第1章的学习我们知道,ansible的通信默认基于ssh,因此我们需要对主机先进行认证。ansible认证方式有密码认证和公私钥认证两种方式,其实完全等同于ssh的认证,所以这里关于这两种认证方式不做过多介绍。ansible默认使用(笔者也建议各位使用)公私钥认证方式,究其原因无非是出于安全的考虑,密码不用明文存放。以本机为例,执行如下命令即可添加本机认证信息。
随机生成公私钥对,ssh-keygen是linux下认证密钥生成、管理和转换工具,详细用法可参考其man文档
ssh-keygen -n -b
4096 -t rsa -c [email protected] -f root.sshstanley.rsa
为本机添加密钥认证
ssh-copy-id –i
root.sshstanley.rsa root@localhost
输入的时候会有如下提示:
are you sure you
want to continue connecting (yesno)
输入全小写的英文字母yes即可。
而后会有类似如下提示输入对应root用户的密码信息:
root@localhost's
password
输入正确的密码信息后结果认证,随后在当前命令行输入如下命令尝试免密码登录:
ssh -i
如不提示输入密码即可直接登录则表示密钥验证成功。当然,这里只是为大家简要演示密钥认证的过程,实际应用中为方便起见,一般会使用非root用户生成默认文件名为id_rsa、id_rsa.pub的密钥对,在使用时通过sudo的方式获取权限。
ansible的命令使用格式如下:
ansible
host-pattern [options]
host-pattern是inventory中定义的主机或主机组,可以为ip、hostname、inventory中的group组名、具有“.”或“”或“:”等特殊字符的匹配型字符串,表示该选项是必须项,不可忽略。
[options]是ansible的参数选项,[]表示该选项中的参数任选其一。
ansible命令可用选项非常多,这里列举如下会用到的选项,详细选项可参考man或第3章。
-m name,
--module-name=name:指定执行使用的模块。
-u username,
--user=username:指定远程主机以username运行命令。
-s, --sudo:相当于linux系统下的sudo命令。
-u
sudo_username, --sudo-user=sudo_username:使用sudo,相当于linux下的sudo命令。
具体示例如下:
以bruce用户执行ping存活检测
ansible all -m
ping -u bruce
以bruce sudo至root执行ping存活检测
ping -u bruce --sudo
以bruce sudo至batman用户执行ping存活检测
ping -u bruce --sudo --sudo-user batman
但在新版本中ansible的sudo命令废弃,改为--become或-b,如上命令需改为如下:
ping -u bruce -b
ping -u bruce -b --become-user batman
ansible-playbook的命令用法和ansible略有不同,虽然参数选项与ansible有很多相同的地方,但也新增了针对ansible-playbook特有的参数。
ansible-playbook的命令使用格式如下:
ansible-playbook
playbook.yml
ansible-playbook命令后跟事先编辑好的playbook.yml文件即可。本节只简单介绍其用法,在第4、5、6章有大量内容介绍其写法、高级用法及优化方向。ansible-playbook新增的功能参数如下:
--ask-vault-pass:加密playbook文件时提示输入密码。
-d, --diff:当更新的文件数及内容较少时,该选项可显示这些文件不同的地方,该选项结合-c用会有较好的效果。
-e extra_vars,
--extra-vars=extra_vars:在playbook中引入外部变量。
--flush-cache:将fact清除到的远程主机缓存。
--force-handlers:强制运行handlers的任务,即使在任务失败的情况下。
-i inventory:指定要读取的inventory文件。
--list-tags:列出所有可用的tags。
--list-tasks:列出所有即将被执行的任务。
--skip-tags=skip_tags:跳过指定的tags任务。
--start-at-task=start_at_task:从第几条任务开始执行。
--step:逐步执行playbook定义的任务,并经人工确认后继续执行下一步任务。
--syntax-check:检查playbook中的语法书写。
-t tags,
--tags=tags:指定执行该tags的任务。
在日常工作中,大家经常会遇到批量添加认证的问题,而逐条添加认证方式,如机械地对每台主机都一条条添加认证,那是一件非常麻烦的事,也违反了我们期望的自动化方式。具体的批量添加认证方式请参考第9章。如前面所介绍,ansible不仅有ansible、ansible-playbook命令,还有ansible-galaxy、ansible-pull、ansible-doc、ansible-vault、ansible-console(2.0版本新增)命令,掌握ansible的基础用法后,我们将更深一步学习ansible系列命令。