まず、上記の一部のコンテンツがあるバーレーン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()は、 検索結果を返します