Ansibleでラズパイ構築 -準備編-

RaspberryPi

前回、RasoberryPi Zero購入しましたが、メインは性能の高いRaspberryPi 3で運用していきます。
本題だけ見たい人はこちらを参照。

RaspberryPi 3の運用用途は以下です。

  • sambaでファイルサーバ
  • xrdpからリモートデスクトップでyoutube視聴(ラジオ目的のため音声メイン)
  • hubotで家電操作
  • apacheでRedmineの運用
  • etc

で、ラズパイZeroのほうは上記の環境に加えて、新たに必要な環境を構築する前の検証機として使用する予定です。

メイン環境を汚したくない、という思いから本番環境と検証環境を分離する形ですね。

それで、上記の環境を構築すために今回はAnsibleを使用します。
まだAnsibleの設定ファイル作成は途中なので、こけたところを備忘録として残しておきます。

Ansibleとは?

まず初めに、Ansible(アンシブル)とは、OSの設定や、ミドルウェアのインストール・設定などを設定ファイルに従って自動でやってくれるものです。

Ansibleマシン からSSHで接続して、構築対象マシンの環境を自動で構築してくれる流れになります。
最近は、仮想化の技術が主流で、エンジニア1人で何十台、何百台もサーバを構築したりします。
画像では対象の構築マシンが1台ですが、複数同時に構築することもできます。環境が同じであれば、Ansible用の設定ファイルを1つ作成して、コマンドをたたけば一気に構築を行うことができます。

時間短縮になる上に、手作業でない分、ミスも劇的に減ります。

まあ私の場合は、勉強が主目的なのでAnsible本来の恩恵は少ないですが、うっかり環境をぶっ壊してしまったときにすぐに再構築できるようにできる、バックアップ的な使用用途を想定しています。
※以前homeフォルダを削除する暴挙をして壊したことがあります。

raspi本体のバックアップは、SDカードをWindowsにさしてimgファイルを抽出する方法がメインでヒットするので、それは面倒くさすぎるので。

使用環境

私のAnsibleの使用環境は以下です。

Ansibleマシン:CentOS7.6(Hyper-Vにインストール)
 Ansibleバージョン:ansible 2.8.4

構築対象マシン:RaspberryPi3、RaspberryPiZero

Ansible expect モジュール

ようやく本題です。

Ansibleでキーボード入力を自動化するためのモジュールにexpectがあります。これでこけまくったので、備忘録として残しておこうと思います。

やりたかったこと pdbeditコマンド

ラスパイ3では、sambaでファイルサーバを運用しています。

sambaユーザを作成するためにpdbeditコマンドを流し、パスワードを設定しようとしたのですが、2か所こけたのでそれぞれ残しておきます。

その1 pexpectモジュールがないと怒られる

まず次のようなエラーに直面しました。

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ImportError: No module named pexpect
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (pexpect) on raspberrypi's Python /usr/bin/python. Please read module documentation and install in the appropriate location"}

普通にエラーを読めば、『No module named pexpect』から、pexpectモジュールがインストールされていないだとわかりますが、Ansibleマシンにはインストール済みだったのですが、何度やっても同じエラーが出ます。

結論を言うと、pexpectモジュールがないと怒っているのは、ラズパイのほうだったのです。めちゃくちゃ単純なミスを犯しました。

ということで、Ansibleの設定ファイルに次のように追加しました。

- name: module install 1
  apt:
    name: python-pip #pexpectモジュールインストールのためにpipインストール
- name: module install 2
  command: pip install pexpect #pipからpexpectモジュールをインストール
##### この後にpexpectモジュールを使う処理 #####

これで、自動構築でpexpectモジュールが扱えるようになりました。

その2 タイムアウトしたと怒られる

sambaユーザを作成するために以下のコマンドを実行し、パスワードを設定する処理を書いたのですがタイムアウトしたとかエラーで落ちました。

実行したコマンド:pdbedit -a (username)
エラー:"msg": "Timeout (12s) waiting for privilege escalation prompt: "

ちなみにAnsibleの内容は次で、プロンプト側で実際にコマンドを実行すると次のように入力待ちになります。

### Ansibleの内容 ※動かない例###
- name: samba user create
  expect:
    command: pdbedit -a share                  #コマンド実行
    responses:
      "(?i)new password:": "(password)"        #new password:が表示されたら(password)を入力
      "(?i)retype new password:": "(password)" #retype new password:が表示されたら(password)を入力
### ラスパイプロンプトの処理の流れ ###
pi@raspberrypi:~ $ pdbedit -a pi
new password:

エラー内容がタイムアウトしているとか出るので、Timeout時間を長くしたり対応しましたが、まったく治りません。

というのも、Timeoutではないからです。次のように修正したら動きました。

### Ansibleの内容 ※修正版 ###
name: samba user create
 expect:
 command: pdbedit -a share                  #コマンド実行
 responses:
   (?i)new password: "(password)"        #new password:が表示されたら(password)を入力
   (?i)retype new password: "(password)" #retype new password:が表示されたら(password)を入力

赤字の箇所なのですが、具体的には””で囲うのをやめて、(?i)new password:の”:”を削除した形になりります。

参考にしたサイトは””で囲っていたのでマネしましたが、バージョンが違ったりする差異なんでしょうか。なんでこれで動くのかはわかりませんが、まあ動いたからとりあえず良しとします。

まとめ

Ansible使った感想は、めちゃくちゃ便利。煩わしいOSやミドルウェアの設定を自動でやってくれるし、ファイルの書き方さえ覚えてしまえば反映もすぐにできる。Windowsの構築もできるようなので、そっちにも挑戦していきたいです。

その反面、エラー内容がめちゃくちゃ不親切だなと感じました。ここで紹介したもの以外にもいくつかこけていますが、取りえずエラーが分かりづらい。
あと、インデントを間違うと、エラーで動かなくなります。インデントが処理のブロック分けになっているようですね。Pythonに似てますね。

エラーは分かりづらいですが、大抵のことは先駆者がやってくれているので、ググれば出てきますのでAnsibleマスターできるように思います。

スポンサーリンク

コメント

タイトルとURLをコピーしました