基于Ansible 1.9.6。Github
概述
ansible是ansible用于实现ad-hoc的命令行工具。而ansible位于ansible/bin/下。
开箱了
主流程:__mian__
- 新建Cli()实例, 命名为
cli - 调用
cli.parse()解析命令行参数及其值 - 调用
cli.run进行某项操作。←_←这个是核心 - 解析并展示结果。对返回结果中的
results['contacted']的每一项,若有failed值或者,rc键值不为0,表示该操作失败;若results['dark']不为空,则表示执行该操作的主机有问题,死掉之类的。
一窥Cli类
该类定义于
ansible/bin/ansible中
初始化
- 声明两个属性:
stats:类型为ansible.callbacks.AggregateStats。该类型主要用于对ansible.runner.Runner.run的返回结果进行统计(这个有机会会提到)。但是实际上,在ansible这个命令中,并未用到。callbacks:类型为ansible.callbacks.CliRunnerCallbacks。该类型专门用于ansible这个cli。主要作用是ansible.runner.Runner.run运行后各种返回状态的处理操作(这个有机会也会提到)
- 一项操作 检查配置文件中的
bin_ansible_callbacks项或者环境变量ANSIBLE_LOAD_CALLBACK_PLUGINS是否为True。是则调用ansible.callbacks.load_callback_plugins来加载回调插件
解析命令行参数及其值:parse()
使用包
optparse
创建一个基本的选项解析器:(以下备忘及凑字数)
说明:下面所说的
constants指的是ansible.constants-v/--verbose:冗余模式(-vvv 打印更多信息;-vvvv 启用连接调试),默认值:False-f/--forks:指定并行处理数,默认值:由constants.DEFAULT_FORKS指定-i/--inventory-file:指定inventory主机文件,默认值:由constants.DEFAULT_HOST_LIST指定-e/--extra-vars:设置额外的变量,格式为key=value或者YAML/JSON,默认值:[]-u/--user:指定连接的用户,默认值:由constants.DEFAULT_REMOTE_USER指定-k/--ask-pass:询问SSH密码,默认值:False--private-key:使用该文件来验证连接,默认值:由constants.DEFAULT_PRIVATE_KEY_FILE指定--ask-vault-pass:询问vault密码,默认值:False--vault-password-file:vault密码文件,默认值:由constants.DEFAULT_VAULT_PASSWORD_FILE指定--list-hosts:输出匹配主机列表;不执行任何其他操作-M/--module-path:指定module库的路径(可多个),默认值:None-l/--limit:进一步用额外的pattern限制所选的主机,默认值:由constants.DEFAULT_SUBSET指定-T/--timeout:覆盖SSH超时时间,以秒为单位,默认值:由constants.DEFAULT_TIMEOUT指定-o/--one-line:精简输出-t/--tree:将输出保存到该目录中,默认值:None-K/--ask-sudo-pass:询问sudo密码(已弃用,使用become),默认值:由constants.DEFAULT_ASK_SUDO_PASS指定--ask-su-pass:询问su密码(已弃用,使用become),默认值:由constants.DEFAULT_ASK_SU_PASS指定-s/--sudo:使用sudo(无密码)运行操作(已弃用,使用become),默认值:由constants.DEFAULT_SUDO指定-U/--sudo-user:所需sudo用户(已弃用,使用become),默认值:root、-S/--su:使用su(无密码)运行操作(已弃用,使用become),默认值:由constants.DEFAULT_SU指定-R/--su-user:所需su用户(已弃用,使用become),默认值:None-b/--become:使用become运行操作(无密码),默认值:由constants.DEFAULT_BECOME指定--become-method:所使用的升级特权的方法,可选值由constants.DEFAULT_BECOME_METHOD和constants.BECOME_METHODS指定,默认值:由constants.DEFAULT_BECOME_METHOD指定--become-user:使用该用户运行操作,默认值:由constants.DEFAULT_BECOME_USER指定--ask-become-pass:询问升级特权的密码,默认值:False-c/--connection:使用的连接类型,默认值:由constants.DEFAULT_TRANSPORT指定-P/--poll:如果使用-B选项,则用该选项设置poll间隔,默认值:由constants.DEFAULT_POLL_INTERVAL指定-B/--background:异步运行,在X秒后失败,默认值:0-C/--check:不进行任何改动;而是用来预测可能会发生的一些改动,默认值:False
添加额外的命令行参数
-a/--args:模块参数-m/--module-name:模块名
返回解析出来的选项和参数值
运行操作:run(options, args)
这里的两个参数就是
parse()返回的两个值
- 做准备
- 若选项
-c/--connection为"local",表明是在本地运行,因此ask_pass不用设置。 - 进行一系列的密码prompt工作,以获得
sshpass/becomepass/vault_pass这三个分别用于登录到远程主机的密码/在远程主机上切换用户所需的密码/加密的文件密码 - 需要的情况下,从文件中读取
vault_pass - 调用
ansible.utils.parse_extra_vars来解析额外的变量(即通过-e/--extra-vars传过来的变量) - 使用
-i/--inventory-file传过来的inventory文件路径与上面得到的vault_pass来初始化ansible.inventory.Inventory实例 - 使用
-l/--limit来缩小inventory中主机的范围
- 若选项
- 除了实际做点什么……
- 检查实际操作的主机数,若为0,则输出提示,退出程序
- 设置了
--list-hosts,则直接将所有要操作的主机都列出来,然后还是退出程序 - (特殊判定)
-m/--module-name参数值为command或者shell,并且参数-a/--args无值,则输出提示,退出程序 - 若设置了
-t/--tree,则确保指定的目录存在且可写,为日志输出做准备
- 核心的核心:
ansible.runner.Runner- 实例化一个
ansible.runner.Runner对象runner - 如果设置了
-B/--background,表示异步运行,并在设置的值那么多时间后超时。此时,使用runner.run_async(),异步运行操作 - 否则,使用
runner.run()直接运行。
- 实例化一个
总结一下
ansible命令其实只是提供了一条直接到ansible.runner.Runner的路。后面等提到ansible-playbook的时候就可以看到,整个ansible工具的核心其实就在于ansible.runner.Runner。OK,鉴于ansible命令相对比较简单,一次执行实现一项操作,因此开箱到此为止。