インフラエンジニアbacchiのわかったことまとめ

bacchi.me

Ansible

Ansibleでrootにrvmをインストールし、playbookでrubyやgemを実行するとパッケージ版のrubyやgemが使われる件

更新日:

Ansibleでrootユーザーにrvmを入れて、gemをインストールするタスクでどハマりしたのでまとめ。

クライアントはCentOS7です。

Ansibleのバージョンは以下の通り。

だめだったパターン

以下のようなPlaybookを用意して、

ansible-playbookコマンドを実行したところ、以下のようなエラーが出現しました。

あれー、rubyのpathが /usr/bin/ruby になってる・・

rubyコマンドをフルパスで指定して、再度実行

rubyのパスがパッケージで入れたrubyのパスになっていたので、
rvmで入れたRubyのフルパスを指定して、再度ansible-playbookを実行。

playbookはこんな感じ。

しかし、同様のエラーが・・

解決策

調べてみると sudo は.sudoを実行したユーザの環境変数が引き継がれないので、一工夫してやる必要がありました。

sudo の -i オプションを使って環境変数を読み込んでやれば /etc/profile を読み込んでくれて、  
rvmでインストールしたrubyを使ってくれるようになりました。

それを踏まえて、rubyのバージョン確認のタスクと、gemインストールのタスクを
sudo モジュールを「sudo: no」とし、rvmで入ったコマンドを叩く時に sudo -i env を
かませることで、想定通りの動きをしてくれるようになりました。

また、「sudo: no」を書いてやるのもポイントです。

gemをフルパスで記述したのにインストールに失敗した理由

フルパスでgemコマンド叩いた時もインストールできなかったのはgemがrubyを呼び出す時に、
環境変数を参照してrubyを呼び出しているため、パッケージ版のrubyが呼び出されていました。

おまけ 完成形のplaybook

Sponsor Link

スポンサーリンク

Sponsor Link

スポンサーリンク

-Ansible
-,

Copyright© bacchi.me , 2018 AllRights Reserved.