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