基于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命令相对比较简单,一次执行实现一项操作,因此开箱到此为止。