質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Bash on Ubuntu on Windows

Bash on Ubuntu on Windowsは、Windows Subsystem for Linux(WSL)の非推奨の名称。Windows10およびWindows Server上でLinuxのバイナリ実行ファイルをネイティブ実行するための互換レイヤーです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Ansible Tutorial

Ansible Tutorialは、Pythonで記述されたサーバの設定・管理を自動化させるためのツールです。サーバからクライアントへ直接命令し結果を取得するため、各クライアントでAnsible Tutorialをインストールが不要になります。

Q&A

解決済

2回答

1971閲覧

bashを用いて、extra-varsオプションを付属したansible-playbookの実行

nagipen1113

総合スコア1

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Bash on Ubuntu on Windows

Bash on Ubuntu on Windowsは、Windows Subsystem for Linux(WSL)の非推奨の名称。Windows10およびWindows Server上でLinuxのバイナリ実行ファイルをネイティブ実行するための互換レイヤーです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Ansible Tutorial

Ansible Tutorialは、Pythonで記述されたサーバの設定・管理を自動化させるためのツールです。サーバからクライアントへ直接命令し結果を取得するため、各クライアントでAnsible Tutorialをインストールが不要になります。

0グッド

1クリップ

投稿2020/09/01 14:34

前提・実現したいこと

ansible-playbookを実行する際、入力の手間を省き、パスワードを自動入力するプログラムを作成したいと考えています。
いくつかのオプションをgetoptを使用して、独自オプションで指定しています。

発生している問題・エラーメッセージ

"--extra-vars"オプションが認識されず、変数がdebugモジュールで表示されません。

./ansible.sh test.yml -l -e test=ts,test2=tts spawn env LANG=C /usr/local/bin/ansible-playbook test.yml -K --connection=local --extra-vars '{"test":"ts","test2":"tts"}' Using /etc/ansible/ansible.cfg as config file BECOME password: PLAY [local] **************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************** ok: [localhost] TASK [debug] **************************************************************************************** fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'test' is undefined\n\nThe error appears to be in '/home/yukki/ansible/playbook/role_make.yml': line 5, column 13, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: make project path\n ^ here\n"} PLAY RECAP ****************************************************************************************************** localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0

該当のソースコード

bash

1!/bin/bash 2 3PASS="pass" 4 5#オプション処理 6#vオプションはカンマで区切ることで複数指定が可能 7OPT=`getopt -o e: -- "$@"` 8eval set -- "$OPT" 9while [ $# -gt 0 ] 10do 11 case $1 in 12 -e) e_list=(${2//,/ });; 13 --) shift; break;; 14 esac 15 shift 16done 17 18#-eオプションがあるときに、e_optionの作成 19if [ -n "${e_list[0]}" ]; then 20 e_option="'{" 21 for h in "${e_list[@]}" ; do 22 e_option+="\"${h%=*}\":\"${h#*=}\"," 23 done 24 e_option="${e_option%,*}}'" 25fi 26 27if [ -n "${e_list[0]}" ]; then 28 cmd="/usr/local/bin/ansible-playbook $1 -K -v --extra-vars $e_option" 29else 30 cmd="/usr/local/bin/ansible-playbook $1 -K -v" 31fi 32 33#password自動入力 34expect -c " 35set timeout 10 36spawn env LANG=C $cmd 37expect \"password:\" 38send \"${PASS}\n\" 39expect \"$\" 40exit 0 41" 42 43exit 0

test.yml

- hosts: local become: yes tasks: - debug: msg: "{{ test }}"

試したこと

とにかくいろいろ試しましたが、"--extra-vars"オプションが認識されなくて困っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。
expect を使用する場合は {} を次のようにエスケープする必要があります。

patch

1--- before.sh 2020-09-02 00:43:34.288722610 +0900 2+++ after.sh 2020-09-02 00:47:48.146795139 +0900 3@@ -17,11 +17,11 @@ 4 5 #-eオプションがあるときに、e_optionの作成 6 if [ -n "${e_list[0]}" ]; then 7- e_option="'{" 8+ e_option="\{" 9 for h in "${e_list[@]}" ; do 10 e_option+="\"${h%=*}\":\"${h#*=}\"," 11 done 12- e_option="${e_option%,*}}'" 13+ e_option="${e_option%,*}\}" 14 fi 15 16 if [ -n "${e_list[0]}" ]; then

以下は実行結果です。

(venv) [root@d36ccf5405a7 ~]# ./after.sh test.yml -e test spawn env LANG=C ansible-playbook test.yml -K -v --extra-vars {"test":"test"} No config file found; using defaults BECOME password: [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [test] ************************************************************************************************************************************************************************************ TASK [debug] *********************************************************************************************************************************************************************************** ok: [localhost] => { "msg": "test" } PLAY RECAP ************************************************************************************************************************************************************************************* localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

投稿2020/09/01 16:13

sky-joker

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagipen1113

2020/09/02 13:57

ありがとうございました! おかげさまでエラーを解決し取り組みたいことの実現ができました。 修正例もとても分かりやすくて、よかったです!
sky-joker

2020/09/02 15:44

解決できてよかったです :)
guest

0

解決法はないですが、expect内では変数が渡せないようですね。
たぶん子プロセスになっているから?

ansible.shを経由せずにextra-vars付でansible-playbookを実行したら問題なく実行できました。

そもそもパスワードの自動入力をしたいようですが、それはホストのパスワード認証のことでしょうか?
それならssh鍵接続にするか、ansible_ssh_pass変数でパスワードを定義するのはいかがでしょうか?
https://docs.ansible.com/ansible/2.3/intro_inventory.html

投稿2020/09/01 15:55

comefigo

総合スコア1045

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagipen1113

2020/09/02 13:58

回答していただきありがとうございました。 ansible_ssh_pass変数の件、参考になりました!
comefigo

2020/09/02 14:29

解決されてよかったです。 シェルでラップするよりスマートかと思いますので、ご参考になれて幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問