その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

OpenWrtの環境に対してAnsibleでプロビジョニングをかける

メモ.
Ansibleを利用するという文脈におけるbareなOpenWrtの環境の特徴としては以下のようなものがある;

  • sftpが有効ではない
  • Pythonランタイムが入っていない

これらを解決すれば,あとはいつものように普通にAnsibleを使える (はず).
というわけでそれぞれに対する対応は以下の通り.

sftp-server が有効ではない

そうした場合にansibleを走らせると以下のようなエラーが出る.

failed to open a SFTP connection (Channel closed.)

対応としては ansible.cfg に以下のように設定を書き込むと良い.

[ssh_connection]
scp_if_ssh=True

公式ドキュメントによると,scp_if_ssh をTrueに設定すると,sftpの代わりにscpを利用してファイルの転送を行なうようになるとのこと *1
なお,環境変数で指定する場合には ANSIBLE_SCP_IF_SSH=true という風に指定すると良い様子.(参照: https://github.com/ansible/ansible/blob/feafae70b579a3890951fd5c7c7b6645c340ff00/lib/ansible/constants.py#L221)

参照: linux - Is the SSH SFTP subsystem required on the managed nodes for Ansible to work? - Server Fault

Pythonランタイムが入っていない

Pythonを入れれば良い……のだが,恐らくOpenWrtが動作するような環境では少しでもストレージの使用量を節約したいというのが人情でしょう.ここではPythonランタイムをインストールせずに済ませる方法を記す.

プロビジョニング対象の環境内にPythonが無い場合,playbook内に gather_facts: no と記述した上で,rawでタスクをモリモリ書いていけば良い.以下例.

- hosts: openwrt
  remote_user: root
  gather_facts: no
  tasks:
  - name: update opkg
    raw: opkg update
  - name: install openssl-util
    raw: opkg install openssl-util

なおplaybookではなくコマンドラインで何らか実行する際にrawを指定するには -m raw というオプションを付けてやると良い.
こうするとPython無しでも動く……のだがAnsibleの旨味がごっそり抜けてしまう (せっかくのOpenWrtサポートを利用できない) ので,もう諦めてPythonを入れてしまったほうが楽かもしれない.

参照: Python が入っていない NW 機器も Ansible で (一応) 制御できる - Qiita

考察

Ansibleを使わないで,普通に環境構築済みのイメージを用意してROM焼いてしまえば良いのでは無いか? (とは言え設定ファイルみたいなやつはAnsibleで撒きたい,みたいなのはあります)

*1:>Occasionally users may be managing a remote system that doesn’t have SFTP enabled. If set to True, we can cause scp to be used to transfer remote files instead: