第二天,ansible源碼學習
阿新 • • 發佈:2018-03-29
ansible 源碼 按照我的理解,源碼學習肯定是一邊看代碼,一邊執行程序驗證。執行的命令是:ansible sz003 -a "ls -l"
下面是ansible.py源碼,學習分析以註釋的形式出現
######################################################## from __future__ import (absolute_import, division, print_function) # 表示基於type創建類,可以忽略 __metaclass__ = type # __requires__ 要求按照的模塊,可能是因為我沒有使用ansible 提供的開發環境腳本的原因,要把這個註釋掉才行 #__requires__ = [‘ansible‘] try: import pkg_resources except Exception: # Use pkg_resources to find the correct versions of libraries and set # sys.path appropriately when there are multiversion installs. But we # have code that better expresses the errors in the places where the code # is actually used (the deps are optional for many code paths) so we don‘t # want to fail here. pass import os import shutil import sys import traceback from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError from ansible.module_utils._text import to_text # 用來顯示信息 class LastResort(object): # OUTPUT OF LAST RESORT def display(self, msg, log_only=None): print(msg, file=sys.stderr) def error(self, msg, wrap_text=None): print(msg, file=sys.stderr) if __name__ == ‘__main__‘: # # 從這裏開始執行 # display = LastResort() try: # bad ANSIBLE_CONFIG or config options can force ugly stacktrace import ansible.constants as C from ansible.utils.display import Display except AnsibleOptionsError as e: display.error(to_text(e), wrap_text=False) sys.exit(5) # # cli 是用來存儲ansible 執行命令的對象 # cli = None # # 獲取執行的文件名,在下面的代碼中,根據文件名判斷是實例adhoc 對象還是 playbook 對象 # ansible-playbook 這部分代碼是類似 # me = os.path.basename(sys.argv[0]) print("me:"+me) try: display = Display() display.debug("starting run") sub = None target = me.split(‘-‘) if target[-1][0].isdigit(): # Remove any version or python version info as downstreams # sometimes add that target = target[:-1] if len(target) > 1: sub = target[1] myclass = "%sCLI" % sub.capitalize() elif target[0] == ‘ansible‘: sub = ‘adhoc‘ myclass = ‘AdHocCLI‘ else: raise AnsibleError("Unknown Ansible alias: %s" % me) try: # # 這裏是獲取 adhoc 還是 playbook # mycli = getattr(__import__("ansible.cli.%s" % sub, fromlist=[myclass]), myclass) except ImportError as e: # ImportError members have changed in py3 if ‘msg‘ in dir(e): msg = e.msg else: msg = e.message if msg.endswith(‘ %s‘ % sub): raise AnsibleError("Ansible sub-program not implemented: %s" % me) else: raise try: # # 這裏是處理參數,也就是執行命令時輸入的 sz003 -a "ls -l" # args = [to_text(a, errors=‘surrogate_or_strict‘) for a in sys.argv] except UnicodeError: display.error(‘Command line args are not in utf-8, unable to continue. Ansible currently only understands utf-8‘) display.display(u"The full traceback was:\n\n%s" % to_text(traceback.format_exc())) exit_code = 6 else: # # 這裏就是具體實例化了 # cli = mycli(args) # # 整理參數 # cli.parse() # # 執行命令 # exit_code = cli.run() # # 下面大多數是處理異常代碼,最後面有清理臨時目錄操作 # except AnsibleOptionsError as e: cli.parser.print_help() display.error(to_text(e), wrap_text=False) exit_code = 5 except AnsibleParserError as e: display.error(to_text(e), wrap_text=False) exit_code = 4 # TQM takes care of these, but leaving comment to reserve the exit codes # except AnsibleHostUnreachable as e: # display.error(str(e)) # exit_code = 3 # except AnsibleHostFailed as e: # display.error(str(e)) # exit_code = 2 except AnsibleError as e: display.error(to_text(e), wrap_text=False) exit_code = 1 except KeyboardInterrupt: display.error("User interrupted execution") exit_code = 99 except Exception as e: have_cli_options = cli is not None and cli.options is not None display.error("Unexpected Exception, this is probably a bug: %s" % to_text(e), wrap_text=False) if not have_cli_options or have_cli_options and cli.options.verbosity > 2: log_only = False if hasattr(e, ‘orig_exc‘): display.vvv(‘\nexception type: %s‘ % to_text(type(e.orig_exc))) why = to_text(e.orig_exc) if to_text(e) != why: display.vvv(‘\noriginal msg: %s‘ % why) else: display.display("to see the full traceback, use -vvv") log_only = True display.display(u"the full traceback was:\n\n%s" % to_text(traceback.format_exc()), log_only=log_only) exit_code = 250 finally: # # 最後如註釋說的,清理臨時目錄 # # Remove ansible tempdir shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) sys.exit(exit_code)
明天就轉到學習ansible具體執行命令的流程了,也就是下面代碼段
cli = mycli(args)
cli.parse()
exit_code = cli.run()
第二天,ansible源碼學習