登録された変数(レジスタ)
操作後のansibleモジュールは、実際には、「戻り値」の一部を返しますが、デフォルトでは、「戻り値は」それを示していない、我々はこれらの値が変数に書き込まれ返すことができ、我々はできるように、ようには、これらの戻り値を参照することにより、対応する変数を取得して、このモジュールは、「レジストリ変数」と呼ばれる変数に書き込む値メソッドを返します。そして、どのように戻り値は変数それに登録されますが、?のは、脚本の例を見てみましょう:
--- -ホスト:192.168.10.3 REMOTE_USER:ルート タスク: -名前:テストシェル シェル: "エコーテスト> /テスト/テストファイル" に登録:testvar -名前:シェルmouduleの戻り値の デバッグ: VAR:testvar
前の例の2つのタスクがありますが、最初のモジュールが192.168.10.3ホストでテストファイル/テスト/テストファイル、文字「テスト&」テストファイルへの入力をシェルを使用してタスクを作成し、「登録」キーワードを使用します「testvar」と呼ばれる書かシェル変数リターンタスクの現在の値は、デバッグモジュールを使用して、第2のタスクは、レジストリ変数の最初のタスクの値を出力し、はい、登録した変数は、登録キーを使用するのと同じくらい簡単です言葉は、変数名が対応することが可能に指定します。
名前付きコンソールタスクで見ることができます上記の脚本「[シェルモジュールの戻り値]を」実行した後、次のような情報を返し、最初のタスクの戻り値で表示されています:
TASK [シェルmoudule戻り値] ******************************************* ************************* OK:[192.168.10.3] => { "testvar":{ "変更":真 、"CMD": "エコーテスト> /試験/テストファイル"、 "デルタ": "0:00:00.006927"、 "終了": "2019年8月25日15:11:22.618806"は、 "失敗":偽、 "RC"を0 、 "スタート": "2019年8月25日15:11:22.611879"、 "標準エラー": ""、 "stderr_lines":[]、 "STDOUT": ""、 "stdout_lines":[] } }
返された上記の情報からわかるように、戻り値は、このような「変更:真」として、戻り値のJSON形式は、いくつかのキーと値のペアが含まれているか、「CMD:テスト/テスト/テストファイルエコー」というように、あなただけしたい場合取得します以前に説明したように、あなたが(2つの構文を使用することができ、唯一のキーで、キーと値のペアが、私はちょうど情報にcmdで返された値を取得したいと仮定することができる指定する必要があり、特定の値を返します例えば、以下の二つの構文を介して、さらに)本明細書に記載されていません。
语法一:
-名:シェルmouduleリターンが値 :デバッグ メッセージ: "{{testvar.cmd}}" 语法二: -名:シェルmouduleリターンが値 :デバッグ "{{testvar [ 'CMD']}}":MSGを
第二に、ユーザーが情報を入力するように要求し、変数(インターワーキング)を書き込みされます
あなたには、いくつかのスクリプトを実行すると、時々 、スクリプトはいくつかの情報を入力するようユーザーに促し、ユーザーが入力した情報に基づいてスクリプトのニーズは次のアクションを決定し、この「インタラクティブ」は時にはそれは、これを達成するためにどのようにある脚本には、その後、必要です相互作用の種類は?私たちは、これを行うことができ、ユーザーが情報を入力するように促されて、私たちがいる限り、対応する参照変数として、「入力情報」の使用、それらを必要とするときに、指定された変数にユーザーが入力した情報を格納します。
次のようにのは、小さな例を見てみましょう:
--- -ホスト:192.168.10.3 REMOTE_USER:ルート vars_prompt: -名前: "your_name" プロンプト: "何があなたの名前である" -名: "your_age" プロンプト: "何歳されます" タスク: -名前:出力VARSの デバッグ: MSG:あなたの名前は{{}} your_name、あなたは{{}} your_age歳
上の例で示したように、我々は2つの変数を作成するには、「vars_prompt」キーワードを使用して、これらの二つの変数の名前は「your_name」と「your_age」だった、患者は実行時に脚本とき、あるでしょうが、「あなたの名前は何ですか」メッセージは、ユーザが入力した情報は、「あなたは何歳にしている」ユーザーが入力したプロンプト情報、情報は上記の例では、「your_age」変数にそこに入金されますされるまでの「your_name」変数に入金されます出力単語の意志「出力VARS」タスクは、この文は、2つの変数の値が含まれている、我々は結果の実装の例を見てみましょう。
上の図に示すように、あなたが脚本を実行すると、あなたの年齢を入力して、あなたの名前を入力するよう要求されます、あなたはコンテンツを入力コンテンツの完成を入力するように求めた後、画面上に表示されることはありません、出力することができ、「出力VARS」タスクユーザー入力の名前と年齢を参照してください。
あなたが見ることができるようにあなたは、デフォルトでは、ユーザーにプロンプトを表示するために、このメソッドを使用する場合、ユーザーが入力した情報が表示されない、ユーザーが入力した情報を表示したい場合、ユーザは、パスワードを入力するシーンに適しこのアプローチは、使用することができます例の方法:
vars_prompt: -名前:「your_name」 プロンプト:「あなたの名前は何ですか」 プライベート:いいえ -名前:「your_age」 プロンプト:「あなたは何歳」 プライベート:なし
上記の例では、「プライベート:なし」は、秘密鍵で、私有財産が無い変数に設定することができ、「vars_prompt」変数を定義しないデフォルトでは、変数の非独占、目に見えるの値を示し、プライベートの下にはいている、彼らは見えていないと述べました。
我々はまた、つまり、ユーザーは任意の情報、変数にデフォルト値を入力しない場合は、例の脚本は、次のようにメッセージのデフォルト値を設定することができます。
--- -ホスト:192.168.10.3 REMOTE_USER:ルート vars_prompt: -名: "ソリューション" プロンプト: "あなたが望むソリューションを選択してください\ nは A:solutionA \ nは B:solutionB \ nは C:solutionC \ n"は プライベート:なし デフォルト:Aの タスク: -名前:出力はvarsの :デバッグ メッセージ:最終溶液は{{}}溶液
上記の例に示すように、ユーザが任意の値を(直接入力)を入力しない場合、我々は、デフォルトキーワード「溶液」変数を設定されたデフォルト値を使用し、その後、「溶液」の値を変数は、ユーザが値を入力した場合、Aに設定されています、「溶液」は、ユーザによって入力変数の値です。
前の例では、我々は情報の使用は、ユーザーがパスワードプロンプトを設定することができます言及することができ、この機能を使用すると、私たちは脚本を書くことができ、脚本は、ユーザーがユーザー名とパスワードを手動で入力することができますし、ユーザーが入力した情報を作成しますシステムユーザー、およびあなたは、ユーザーが、以前に総括されている「ユーザモジュール」は、ここで言及されていないユーザモジュールを作成するためにシステムを使用することができると思うので、のは、対話的に直後に脚本を作成することができ、システムのユーザーを書くために試してみましょう必要がありますようにスマート脚本を次のように考えて、私はあなたが問題がで脚本があるが何であるかを見つける私を助けることができ、書きました。
--- -ホスト:192.168.10.3 REMOTE_USER:ルート vars_prompt: 名: "USER_NAME" プロンプト: "ユーザー名を入力しない" プライベート:なし 名前: "USER_PASSWORD" promp: "ユーザーのパスワードを入力し、" タスク: -名前:作成するユーザーの ユーザーを: 名前: "{{USER_NAME}}" パスワード: "{{USER_PASSWORD}}" ###パスワード参数后面应该跟哈希值
脚本の例では何も間違っていないようだが、見られるように、あなたは注意する必要があり、ユーザーパスワードのパラメータモジュールを使用すると、ユーザーのパスワードを指定することもできますが、しかし、パスワードのパラメータは、対応する値は、「パスワードのハッシュ文字列の後にクリアテキスト」でなければなりません上記の例では、ユーザーのパスワード文字列の後にハッシュされた操作のためのプロンプトは表示されませんので、あなたが脚本を介してユーザを作成することができても、の/ etc /に保存されているため、ユーザーは、経由でログオンするためのパスワードを作成することはできません。フィールドシャドウパスワードファイルには、平文パスワードフィールドのハッシュではありません。だから、どのように我々はそれを行うことができますか?はい、私たちは、入ってくるユーザモジュールの後に、パスワードのハッシュ文字列パラメータ、我々は考慮にこの点を取らなければならないansibleをユーザーが入力したパスワードのハッシュ文字列を必要とする、私たちは、「暗号化」キーワードを使用することができます、ユーザ入力文字列のハッシュ、変数情報は、例えば、後で対応するハッシュにユーザによって入力されます。
--- -ホスト:192.168.10.3 REMOTE_USER:ルート vars_prompt: -名前: "hash_string" プロンプト: "番号を入力し、" プライベート:いいえ 暗号化: "sha512_crypt" タスク: -名前:ハッシュ後の出力文字列 デバッグ: MSG:「{ {hash_string}}」
除了能够使用“encrypt”关键字对字符串进行哈希加密,还能够使用“confirm”关键字实现类似确认密码的功能,我们在为用户设置密码时,通常需要输入两次完全相同的密码,才能够设置成功,通过“confirm”关键字就能实现类似的效果,示例playbook如下:
--- - hosts: 192.168.10.3 remote_user: root vars_prompt: - name: "user_name" prompt: "Enter user name" private: no - name: "user_password" prompt: "Enter user password" encrypt: "sha512_crypt" comfirm: yes tasks: - name: create user user: name: "{{user_name}}" password: "{{user_password}}"
三、通过命令传入变量
除了之前总结过的定义变量的方法,我们还能够在执行playbook时直接传入需要使用的变量,我们来看一小示例,如下:
--- - hosts: 192.168.10.3 remote_user: root tasks: - name: "Passing Variables On The Command Line" debug: msg: " {{pass_var}}"
上例中的playbook中,并没有定义pass_var变量,而是直接引用了pass_var变量,我们可以在调用上述playbook时直接从命令行传入pass_var变量,方法如下:
[root@ansible-control playbook]# ansible-playbook play15.yml --extra-vars "pass_var=cmdline pass var"
如上例所示,在调用playbook时使用 “-extra-vars” 选项可以传递对应的变量与变量值, “--extra-vars” 是长选项,对应的短选项是“-e”,我们也可以一次性传入多个变量,变量之间用空格隔开,如下:
[root@ansible-control playbook]# ansible-playbook play15.yml -e 'pass_var="test" pass_var1="test1" '
上例中的playbook中并没有定义pass_var变量,如果在调用playbook时也没有传入pass_var变量,则会报错,其实,我们也可以先在playbook中定义好变量,然后在执行playbook时,再次传入相同名称的变量,最终还是以传入的变量值为准,示例如下:
--- - hosts: 192.168.10.3 remote_user: root vars: pass_var: test_default tasks: - name: "Passing Variables On The Command Line" debug: msg: " {{pass_var}}"
上例的playbook中定义了pass_var变量,其值为"test_default",在执行上述playbook时,从命令行再次传入pass_var变量,命令如下:
[root@ansible-control playbook]# ansible-playbook play15.yml -e 'pass_var="test"'
执行上述命令后,你会发现,最终输出的值为“test”而非“test_default”,也就是说,命令行传入的变量的优先级要高于playbook中的变量,通过这种方法,我们就能够更加灵活的指定变量的值了。
不仅ansible-playbook命令可以使用“-e”传递变量,ansible命令也同样可以,所以在执行ad-hoc命令时也可以使用同样的方法传入变量,如下:
[root@ansible-control playbook]# ansible 192.168.10.3 -e "testvar=test" -m shell -a "echo {{testvar}}" 192.168.10.3 | CHANGED | rc=0 >> test
上述的几个示例从命令行中传递变量时,都是使用了“key=value”的形式,除了使用“key=value”的方式传递变量,ansible还支持通过json的格式传入变量,示例如下:
通过json格式传入两个变量:
[root@ansible-control playbook]# ansible-playbook play15.yml -e '{"testvar":"test","testvar1":"test1"}'
通过json格式传入稍微复杂一点的变量:
[root@ansible-control playbook]# ansible-playbook play15.yml -e '{"countlist":["one","two","three","four"]}'
在剧本中引用上述命令传入的countlist变量时,如果想要获取到值“one”,则可以使用如下两种语法引用变量
{{countlist[0]}} 或者 {{countlist.0}}
命令行不仅能够传入变量,还能传入变量文件,变量文件中的变量都会一并被传入,变量文件可以是json格式的,也可以是YAML格式的,此处使用YAML格式的变量文件进行示例,示例文件内容如下:
[root@ansible-control test]# vim testvar testvar: testvarinfile countlist: - one - two - three - four
测试用playbook内容如下:
--- - hosts: 192.168.10.3 remote_user: root tasks: - name: "Passing Variables On The Command Line" debug: msg: "{{testvar}} {{countlist[0]}}" ###这里[0]表示第一个数,[1]表示第二个数,依此类推。
如playbook所示,playbook中引用了变量文件中定义的两个变量,那么,我们怎样从命令行中将变量文件中的变量传入playbook呢?示例如下:
[root@ansible-control playbook]# ansible-playbook play16.yml -e "@/test/testvar" ###@后面的路径是受控主机上新建文件的路径。
如上述命令所示,使用“@”符号加上变量文件的路径,即可在命令行中传入对应的变量文件,变量文件中的所有变量都可以在playbook中引用,还是很方便的吧。