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

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

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

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

Ansible

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

Q&A

解決済

4回答

4120閲覧

Ansibleの管理対象でshellファイルを実行し環境変数を設定する方法について

kappa0923

総合スコア146

Linux

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

Ansible

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

0グッド

0クリップ

投稿2021/08/08 13:57

編集2021/08/08 14:42

前提

  • Ansibleで複数サーバに対し製品のインストール・設定を行う環境の構築中
  • 製品はOSSなどではなく、とある会社固有の製品

実現したいこと

とある製品のインストール手順の中でshellファイルを読み込んで環境変数を設定し、その後のインストールなどを行うものがあります。

例)

bash

1$ source ./set_env.sh 2$ ./install_product01.sh 3$ ./install_product02.sh 4...

環境変数が事前にわかっている場合は environment を使えば良いと思うのですが、今回のようにshellファイルに隠蔽されている場合は使えないと考えています。

また、 && などでコマンドをつなげれば設定できることもわかっていますが、インストール手順自体が多く、全てのtaskで毎回 source ./set_env.sh $$ ./install_product01.sh のようにするのは現実的ではないと考えています。

今回のように、Ansibleの管理対象でshellファイルを実行し、環境変数を設定する方法についてご存知の方はいませんでしょうか。

試したこと

  • 最初のtaskで source ./set_env.sh を実行

→ 次のtaskに引き継がれておらずNG

例)以下のような作りではインストール時に環境変数が設定されていないように見えた。

- name: 環境変数設定 shell: ./set_env.sh - name: インストール01実施 shell: ./install_product01.sh

補足情報(FW/ツールのバージョンなど)

  • Ansible: 2.9.1
  • Python: 2.7.5

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

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

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

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

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

takasima20

2021/08/08 20:53

set_env.sh と各スクリプトを合わせた新たなスクリプトを用意するのは可能ですか? (倫理的な意味で)
kappa0923

2021/08/09 01:29

ご回答ありがとうございます。 皆様の回答の方向性もそれぞれを合わせたshellとする方針のようなので、可能なのか一度内部で確認してみます。
kappa0923

2021/08/15 12:23

皆様ご回答ありがとうございました。 各スクリプトを合わせることは要件上難しかったため、各タスクで毎回sourceを使用して環境変数を読み込むことになりました。 BAには面白い方向性で回答をいただけたSatoruSATOHさんを選ばせていただきます。
guest

回答4

0

また、 && などでコマンドをつなげれば設定できることもわかっていますが、インストール手順自体が多く、全てのtaskで毎回 source ./set_env.sh $$ ./install_product01.sh のようにするのは現実的ではないと考えています。

これがよくわからないのですが、一つの script にまとめたものを作っておいてそれを送り込んで実行するというのはどうでしょうか。

- name: 環境変数設定 shell: ./set_env.sh - name: インストール01実施 shell: ./install_product01.sh

これをやる代わりに、

/foo/bar/set_env.sh /foo/bar/install_product01.sh

するものを例えば installer.sh として書いておいて、script モジュールを使って実行してみたらどうなりますか。雰囲気としてはこんな感じで。

- name: copy copy: src: /myfile/installer.sh dest: /tmp/installer.sh mode: '0755' - name: run the installer script: /tmp/installer.sh

投稿2021/08/09 01:13

編集2021/08/15 12:34
SugiTK

総合スコア495

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

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

0

ベストアンサー

次のような内容の script か jinja2 template をラッパースクリプトファイルかそのテンプレートとして用意、対象ノードに転送して shell モジュールで実行するということではいかが?

bash

1#! /bin/bash 2# 製品のインスールスクリプトが稚拙なつくりで exit code !0 をきちんと 3# 処理していないなら例えば set -x とだけしておく。 4set -ex 5 6# これはこのスクリプトと set_env.sh、install_product*.sh が同じ場所に 7# ある場合の想定なので、もしそうでないなら適宜、パスを調整 8parent=${0%/*} 9 10[[ test -f ${parent:?}/set_env.sh ]] && source ${parent}/set_env.sh 11for inst_sh in ${parent}/install_product0{1,2}.sh 12do 13 [[ test -f ${inst_sh} ]] && bash -ex ${inst_sh} # -ex は先と同じく適宜変更 14done

(Disclaimer: 全く試してない机上のものなので問題あれば適宜調整下さい。)

投稿2021/08/08 15:38

SatoruSATOH

総合スコア13

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

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

0

コマンド1つ1つをタスクとして管理するかどうか、その判断からかと思います。
その一連の手順が不可分で、かつベンダ指示のものであるならば、自前でタスクに分割するのは厳しいのではないでしょうか。

単純に複数のコマンドを実行するのであれば、こちらのページに色々な議論があります。
https://stackoverflow.com/questions/24851575/ansible-how-to-pass-multiple-commands
コマンド群を with_items でリスト一括指定できるので、個々のコマンドを source setenv.sh && {{ item }} とすることで「現実的ではない」のハードルは無くなるものかと思いますが。
もちろん、一連の手順を記したシェルスクリプトを作って置いて、それを実行させる方法もあります。

どうしてもタスク分割したいなら、環境設定をどうするか考えざるを得ないでしょう。
例えば Perl であれば Shell::GetEnv のように、「シェルが source コマンドでファイルを読み込んだことで設定された環境変数を調べるモジュール」というピンポイントのものがあり、自分でスクリプトを組むことで調べることができます。
こういうのが無くても、環境変数の変化を自分で調べることはさほどは難しくないと思います。
※問題は、実行する機器によって設定内容が変わってくる場合だと対処しきれないことですが。

投稿2021/08/08 15:15

angel_p_57

総合スコア1681

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

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

0

確かに悩ましいですね。

とある会社の製品であれば、製品で用意されているスクリプトをそのまま実行してもいいかと思います。スクリプトの実装によりますが、冪等性が足りない場合はAnsibleで補ってあげればいいかと思います。

スクリプトをAnsibleで再実装するのもいいが、製品の更新でスクリプトが更新されるので整合性を保てるのが大変かと思います。

投稿2021/08/08 14:36

comefigo

総合スコア1051

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

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

kappa0923

2021/08/08 14:44

ご回答いただきありがとうございます。 ただ、仰るようにスクリプトをそのまま実行してみたのですが、次のtaskには引き継がれていないように見えました。 やってみた書き方について、「試したこと」に補足として記載いたしました。
comefigo

2021/08/08 15:18

そういうことですね。 私も以前似たような経験をしましたが、確かに引き継がれないですね。 結局Ansibleで環境変数を定義して逃げました。 ほかの先生方からアドバイスがあるまで待ちましょう。
退会済みユーザー

退会済みユーザー

2021/08/10 08:17

test
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問