入口ソース手続きの分析ansible

まず、上記の一部のコンテンツがあるバーレーンansible後のはansibleを見てみましょう

[スクリプトルート@ノード1] CAT / binに/ ansible は/ usr / binに/ Pythonの!EASY-INSTALL-SCRIPT: 'をansible == 2.3.4.0'、 'ansible' 
__requires__ = ' ansible 2.3.4.0 == '
#ライブラリのバージョンを実行するスクリプトの名前を指定する指定 __import__pkg_resources ).run_script(ansible == 2.3.4.0 ansibleを

コードのいくつかのシンプルなラインで見つかりました。ここでは、Pythonのpkg_resourcesの使用状況を知るために行くことができます。

これらの行は、最終的に次のスクリプト対応/usr/lib/python2.7/site-packages/ansible-2.3.4.0-py2.7.egg/EGG-INFO/scriptsを実行します

これは、上記のパラメータに来たことがansibleスクリプトを実行しますansibleです。

 だから我々はそれが直接/usr/lib/python2.7/site-packages/ansible-2.3.4.0-py2.7.egg/EGG-INFO/scripts/ansibleファイルを参照してください

__name__ == IF '__main__':
    表示ラストリゾート=()
    CLI =なし
    ミー= os.path.basename(sys.argvの[0])

    のtry:
        ディスプレイ表示=()
        display.debug( "スタートRUN")
        サブ=なし
        ###本の下にアダプタのファイル名を検索するためのコードの束であり、アダプタはラインと互換性があり、あなたはほとんど心配する必要はありません
        = me.splitターゲット(「 - 」)
        ##ここでは、そのようなansibleの小さなバージョンに行くこと-1.4.2 
        ターゲットIF [-1] [0] .isdigit():
            ターゲット=ターゲット[ - 1] 
        lenをIF(ターゲット)> 1:
            [1] =サブターゲット
            のMyClass = "%SCLI" %のsub.capitalize ()
        ELIF対象[0] == 'ansible':
            サブ= 'アドホック' 
            MyClassの= 'AdHocCLI」 
        他:
            AnsibleError( "不明なAnsibleエイリアス:%s"は%私を)上げ

        てみてください:
            #反射导入ansible.cli.AdHocCLI类
            mycli =のgetattr(__輸入__( "ansible.cli%sの。" %サブ、fromlist = [MyClassの])、 MyClassの)
        eとはImportError除く:
            :DIR(電子の'MSG')の場合
                、MSG = e.msg 
            他:
                MSG = e.message 
            場合msg.endswith(」%s'は%サブ):
                AnsibleErrorを上げる(「Ansibleサブプログラム実装されていません:%s」は%私は)
            他:
                上げる

        試みを:
            #各种检查 
            SYSにするために引数= [to_text(、エラー= 'surrogate_or_strictを')。ARGV]
            ### 
        はUnicodeError除きます:
            display.error( 'コマンドライン引数を継続することができない、UTF-8になっていないAnsibleは、現在唯一のUTF-8を理解しています。')
            display.display(u "は、完全なトレースバックでした:\ N \ N%s"は%のto_text(トレースバック.format_exc()))
            exit_code = 6 
        他:
            #此时的引数[U 'は/ usr / binに/ ansible'、u'jack 'U'、O'] 
            CLI = mycli(引数)
            cli.parse()
            exit_code = cli.run()
    AnsibleOptionsError除くEとして:
        cli.parser.print_help()
        display.error(to_text(E)、wrap_text =偽)
        exit_code = 5 
    AnsibleParserError以外Eとして:
        display.error(to_text(E)、
        = 4 exit_code 
        have_cli_options = CLIはなしとcli.optionsはNoneでないされていません
#TQMは、終了コードを確保するためにこれらのケアが、残してコメントを取る
eとAnsibleHostUnreachable除い番号:
#1 display.error(STR(E))
#exit_code = 3 
#AnsibleHostFailed除いとしてE:
#1 display.error(STR(E) )
#exit_code = 2 
    AnsibleError以外Eとして:
        display.error(to_text(E)、wrap_text =偽)
        exit_code = 1 
    KeyboardInterrupt除く:
        display.error( "ユーザ中断実行")
        exit_code = 99 
    の例外を除き、Eとして:
        display.error ( "予期しない例外:%s"の%のto_text(E)、wrap_text =偽)
        またはhave_cli_optionsないhave_cli_options cli.options.verbosity> 2 IF:
            LOG_ONLY = Falseの
        他:
            display.display( "トレースバックに完全に参照してくださいが出て呼び出し、-vvv使用")
            LOG_ONLY = Trueの
        完全でdisplay.display(U」はトレースバックが声をかけWAS:\ N-%S「%のTO_TEXT(traceback.format_exc())、LOG_ONLY = LOG_ONLY)\ N- 
        = 250 exit_code 
    :最後に
        #を削除ansible TEMPDIR 
        shutil.rmtree(C.DEFAULT_LOCAL_TMP、真)
    sys.exit(exit_code)
  さんはこれを見てみようmycli.parseクラスのソースコード:

このパラメータの検出が行われ、より少なく、パラメータがされていない与えられます 
    self.parserのCLI.base_parser =(
  
解析デフ(自己):
    '' ' 'のbin / ansibleのオプションパーサーを作成する' 
    self.parser.add_option( ' - M'、 '--module-name'を、=「モジュール名」

        使用= '%のPROG <ホストパターン> [オプション]'、
        runas_opts =真、
        inventory_opts =真、
        async_opts =真、
        output_opts =真、
        connect_opts =真、
        check_opts =真、
        runtask_opts =真、
        vault_opts =真、
        fork_opts =真、
        module_opts = Trueの場合、

    ansibleアドホックに固有の#オプション
    self.parser.add_option( ' - A'、 '--args'、DEST = 'module_args'、
        ヘルプ= "モジュールの引数"、デフォルト= C.DEFAULT_MODULE_ARGS)
        ヘルプ= "実行するモジュール名(デフォルト=%s)は" %のC.DEFAULT_MODULE_NAME、
        デフォルト= C.DEFAULT_MODULE_NAME)
 
    スーパー(AdHocCLI、セルフ).parse() 入力が実行されるように設定されていないか、IPはこの文を報告します
    lenの場合(self.args )<1:
       上げAnsibleOptionsError(「欠落ターゲットホスト」) 
  #の複数の出力パラメータが与えられるので、これは缶だけself.args 1に等しいです。
    LENのelif(self.args)> 1:
        昇給AnsibleOptionsError( "余分または引数オプション")

    display.verbosity = self.options.verbosity 
    self.validate_conflicts(runas_opts =真、vault_opts =真、fork_opts = Trueが)
  のは、このを見てみましょうmycli.runクラスのソースコード:

    DEF RUN(セルフ):
        '' 'libに行うためにSSHの物事を使用するランナー' 

        スーパー(AdHocCLI、自己を)。
 
        パターン= TO_TEXTを(セルフ.args [0]、エラー= '
 
        #WEは原因がローカルのパスワードの接続は無視されている
        、ここで決意はローカル電話がリモート実行が持っていないローカルであれば、ホストコマンドが実行されたかどうかのIF#をコマンドの方法。
        self.options.connection == IF "ローカル":
            self.options.ask_pass = Falseの

        sshpass =なし
        becomepass =なし
        b_vault_pass =なし

        self.normalize_become_options()
        ###内の構成ファイルからアカウントのパスワードを取得する
        (sshpass、becomepass)=自己.ask_passwords()
        パスワード= { 'conn_pass':sshpass、 'become_pass':becomepass} 

        ローダー=データローダ()

        self.options.vault_password_file IF:
            b_vault_pass = CLI.read_vault_password_file(self.options.vault_password_file、ローダ=ローダ)
            loader.set_vault_password(b_vault_pass)
        のelif self.options.ask_vault_pass:
            b_vault_pass = self.ask_vault_passwords()
            loader.set_vault_password(b_vault_pass)

        variable_manager = VariableManager()
        variable_manager.extra_vars = load_extra_vars(ローダ=ローダ、オプション= self.optionsは)

        =のload_options_vars(self.options)variable_manager.options_vars 

        インベントリ=インベントリ(ローダ=ローダ、variable_manager = variable_manager、host_listを= self.options.inventory)
        variable_manager.set_inventory(インベントリ)

        no_hostsを=偽 
        #ホストコマンドを実行する必要がある表現を0に設定されている場合、決定され、次いでホストファイル内に定義されていない基
        lenの場合(inventory.list_hosts())== 0:
            #空在庫
            display.warning( "ホストのリストを提供さが空である、唯一のローカルホストが利用可能です")
            no_hosts =真

        inventory.subset(self.options.subset)
        ホスト= inventory.list_hosts(パターン)
        就是各种なら#1下面の这驼环境参数判断、这里可以忽略不管。
        もしlenは(ホスト)== 0:
            no_hostsがFalseとself.options.subset場合:
                #無効なリミット
                ( "--limitは任意のホストに一致しない指定")レイズAnsibleError 
            他:
                表示。 ( "いいえホストは、何の関係もマッチしていない")警告 
            hosts内のホストの:
 
        self.options.listhosts場合:
            display.display( 'ホスト(%d)が:' %LEN(ホスト))
                display.display(」%s'は%ホスト)
            戻り0 

        C.MODULE_REQUIRE_ARGSなくself.options.module_argsでself.options.module_name場合:
            ERR = "%sのモジュールに渡される引数なしの" %self.options.module_name 
            場合pattern.endswith( "YML。"):
                ERR = ERR + '(?あなたはansible・脚本を実行することを意味しなかった)' 
            AnsibleOptionsErrorを上げる(ERR) 
アドホックでは動作しないモジュールは避けてください
        (「を含む」、「include_role」)でself.options.module_name場合を:
            AnsibleOptionsError(「 『%s』を上げますアドホックコマンドの有効なアクションではありません」%のself.options.module_name)

        #動的脚本ディレクトリから任意のプラグインを読み込むの尊重のカスタムのみ有効'bin_ansible_callbacks'と'stdout_callback'
        名前のため、OBJ get_all_plugin_loaders中():
            obj.subdirの場合:
                plugin_path = os.path.join( ''、obj.subdir)
                os.path.isdir(plugin_path)の場合:
                    (plugin_path)obj.add_directory 

        play_ds =自己。 _play_ds(パターン、self.options.seconds、self.options.poll_interval)
        )=(再生果たし負荷(play_ds、variable_manager = variable_manager、ローダー=ローダ)。

        self.callbackの場合:
            CB = self.callback 
        のelif self.options.one_line :
            CB = 'としてoneline' のelif C.DEFAULT_LOAD_CALLBACK_PLUGINSとC.DEFAULT_STDOUT_CALLBACK = 'デフォルト':
            CB = C.DEFAULT_STDOUT_CALLBACK 
        他:
            CB = '最小限の' 

        run_tree = Falseの
        場合self.options.tree:
            C.DEFAULT_CALLBACK_WHITELIST.append( '木')
            C.TREE_DIR = self.options.tree 
            run_tree =真

        #今プレイ実行するためのタスク・キュー・マネージャを作成
        self._tqm =なし
        試み:
            self._tqm = TaskQueueManager(
                在庫=在庫、
                variable_manager = variable_manager、
                ローダー=ローダー、
                オプション= self.optionsを、 
                パスワード=パスワード、
                stdout_callback = CB、 
                run_additional_callbacks = C.DEFAULT_LOAD_CALLBACK_PLUGINS、
                run_tree = run_tree、 )
            出口ここでの結果は、ステータスコード、内部self._tqm.runにおけるコマンド実行処理で
            結果= self._tqm.run(プレイ)
        最終的には:
            IF self._tqm:
                self._tqm.cleanup()
            ローダ場合:
                loader.cleanup_all_tmp_files()は、

        検索結果を返します

  

 

           

おすすめ

転載: www.cnblogs.com/Nolover/p/10979308.html