好好学习,天天向上

发生了什么|Ansible之命令ansible开箱指南

基于Ansible 1.9.6。Github

概述

ansible是ansible用于实现ad-hoc的命令行工具。而ansible位于ansible/bin/下。

开箱了

主流程:__mian__

  1. 新建Cli()实例, 命名为cli
  2. 调用cli.parse()解析命令行参数及其值
  3. 调用cli.run进行某项操作。←_←这个是核心
  4. 解析并展示结果。对返回结果中的results['contacted']的每一项,若有failed值或者,rc键值不为0,表示该操作失败;若results['dark']不为空,则表示执行该操作的主机有问题,死掉之类的。

一窥Cli

该类定义于ansible/bin/ansible

初始化

  1. 声明两个属性:
    • stats:类型为ansible.callbacks.AggregateStats。该类型主要用于对ansible.runner.Runner.run的返回结果进行统计(这个有机会会提到)。但是实际上,在ansible这个命令中,并未用到。
    • callbacks:类型为ansible.callbacks.CliRunnerCallbacks。该类型专门用于ansible这个cli。主要作用是ansible.runner.Runner.run运行后各种返回状态的处理操作(这个有机会也会提到)
  2. 一项操作 检查配置文件中的bin_ansible_callbacks项或者环境变量ANSIBLE_LOAD_CALLBACK_PLUGINS是否为True。是则调用ansible.callbacks.load_callback_plugins来加载回调插件

解析命令行参数及其值:parse()

使用包optparse

  1. 创建一个基本的选项解析器:(以下备忘及凑字数)

    说明:下面所说的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_METHODconstants.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
  2. 添加额外的命令行参数

    • -a/--args:模块参数
    • -m/--module-name:模块名
  3. 返回解析出来的选项和参数值

运行操作:run(options, args)

这里的两个参数就是parse()返回的两个值

  1. 做准备
    • 若选项-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中主机的范围
  2. 除了实际做点什么……
    • 检查实际操作的主机数,若为0,则输出提示,退出程序
    • 设置了--list-hosts,则直接将所有要操作的主机都列出来,然后还是退出程序
    • (特殊判定)-m/--module-name参数值为command或者shell,并且参数-a/--args无值,则输出提示,退出程序
    • 若设置了-t/--tree,则确保指定的目录存在且可写,为日志输出做准备
  3. 核心的核心: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命令相对比较简单,一次执行实现一项操作,因此开箱到此为止。

请言小午吃个甜筒~~