AnsibleでRaspberryPiの初期設定を自動化する

Raspberry Pi でいくつか動くものを作ったが、途中から初期設定にかける時間がもったいなく感じ始めた。

てか何度も同じコマンド入力してると、「これは中世の単純労働刑?」みたいに感じられてよろしくない。ので、Ansible様にお願いしたのだった。
そんなPlaybookを最近久しぶりに発掘したので、せっかくだから載せます。
時間って大事ですよね。  

前提

  1. ラズパイはmicroSDにOS入れて初回起動までしておく
  2. SSH接続できるようにしておく。起動後にGUI設定でSSHを許容するのでも、raspbianを入れたmicroSDsshってファイル置いてはじめから動くようにしておくのでもいい。
  3. 再起動後、ターゲットノードの起動を待機しているが、 /etc/hosts にターゲットノードのIPアドレスとホスト名を記載しないと、起動を確認できずエラーになる。ので、書く。

/etc/hosts

192.168.101.18 raspberrypi

↑こんなかんじでファイル末尾に追記しとく

Playbookで実行すること

  1. timezone をAsia/Tokyoにする
  2. SDカードのrootを容量にあわせて拡張する
  3. expandを反映するため再起動、再接続をAnsible側で待機する
  4. apt で vim git mlocate を入れる
  5. apt で既存パッケージをまとめて更新する
  6. 再起動をかけたあと、sshが途切れてもAnsibleに待機させる
  7. 最後の再起動は、Ansibleの画面見なくてもraspberry側画面で「ばっちしおわったぜ」的なPRさせて自分が気づきやすくするため。 いらないんじゃないですか?

あとから知ったこと

最近のバージョンのraspbianは、初回起動時に勝手にrootfsをexpandしてくれるみたい。playbookに書いたexpand-rootfs処理いらなかったかも。

playbook

- hosts: all
  gather_facts: no
  become: yes
  tasks:
  - name: raspi-config --expand-rootfs
    command: raspi-config --expand-rootfs

  - name: reboot
    shell: /sbin/reboot
    async: 1
    poll: 0
    ignore_errors: true

  - name: wait ssh down
    local_action: wait_for host={{ inventory_hostname }} port=22 state=stopped

  - name: wait ssh up
    wait_for: host={{ inventory_hostname }} port=22 delay=30
    delegate_to: 127.0.0.1

  - name: set timezone to tokyo
    timezone:
      name: Asia/Tokyo

  - name: apt update
    apt:
      update_cache=yes
  - name: apt dist-upgrade
    apt:
      upgrade=dist
      force=yes
    ignore_errors: true

  - name: apt install vim mlocate git
    apt: name={{item}} state=present
    with_items:
      - vim
      - mlocate
      - git

  - name: reboot
    shell: /sbin/reboot
    async: 1
    poll: 0
    ignore_errors: true

  - name: wait ssh down
    local_action: wait_for host={{ inventory_hostname }} port=22 state=stopped

  - name: wait ssh up
    wait_for: host={{ inventory_hostname }} port=22 delay=30
    delegate_to: 127.0.0.1

Raspberry Pi でノクトビジョン、暗視ゴーグルを作った (1)

子供の頃にSFとかゲームとかアニメとかで見た、暗視ゴーグル。ナイトビジョンとかノクトビジョンとか言われる、軍用・防犯に使われてあるアレをラズパイと赤外線カメラモジュールで作った話。

TRPGの名作、Dungeons and Dragons のエルフとかドワーフは「赤外線視覚」ってスキルを持っていて暗闇でも物が見えるが、アレを人の身で感じたかった。

ラズパイでサイボーグになるのだ俺は。
Call of Duty 4とか劇場版パトレイバーの冒頭にある夜戦ミッション、暗視装置起動して視界がクリアになるとことか、めちゃかっこいいじゃないですか。

 

というわけで作りました。去年。

f:id:kurokawanushi:20190302133554j:plainf:id:kurokawanushi:20190302133501j:plain

「見える!私にも敵の動きが見えるぞ!」

赤外線に照らされた様子がそのままモニタに映るので、街頭のない闇の原野を歩くのも安心。闇が原因でいつのまにかクマに接近されていきなり先手を取られることもない。

サバゲの夜戦でも安心。サバゲやんないですけど。

とりあえず試作した状態のものはこれ。むきだし。動けばいいの。

f:id:kurokawanushi:20190304233129j:plain 

 装備するとめちゃくちゃ目立つので、いかがわしい目的にはとても使えません。

f:id:kurokawanushi:20190304233204j:plain

 あと、闇で撮影すると、赤外線照射器がほんのり赤く光る。魔王かな?

f:id:kurokawanushi:20190304233243j:plain


必要な部品やコードなどは次回以降載せます。

 

つづく

 

 

AnsibleのyumモジュールでGNOME Desktopが入らない件と対処

そういえば以前、Ansible でCentOSを初期設定していたときGNOME Desktopインストール時にエラーがでた。

端末からだと

$ sudo yum groupinstall "GNOME Desktop"

とやるやつ。

Ansibleのplaybookにこんな感じでgroupinstall 指定しても、Ansibleさまは「そんなパッケージないです」的な英語のつれないお返事をするだけ。

  - name:  groupinstall GNOME Desktop
    yum:
      name: "@GNOME Desktop"
      state: present

公式リファレンスをよくみるとGNOMEの前に^が入ってる。^いれるとちゃんとgroupinstallされる。

  - name:  groupinstall GNOME Desktop
    yum:
      name: "@^GNOME Desktop"
      state: present

公式リファレンスはよく読もうね。というおはなし。