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を入れてしまったほうが楽かもしれない.
考察
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: