Ansible を使用した BSD ホストの管理
BSD マシンの管理は、他の Unix 系マシンの管理とは異なります。BSD を実行している管理ノードを使用している場合は、以下のトピックを確認してください。
BSD ノードへの接続
Ansible はデフォルトで OpenSSH を使用して管理ノードに接続します。これは、認証に SSH 鍵を使用している場合は BSD で動作します。ただし、認証に SSH パスワードを使用する場合、Ansible は sshpass に依存します。sshpass のほとんどのバージョンは BSD のログインプロンプトに適切に対応できません。したがって、BSD マシンに対して SSH パスワードを使用する場合は、OpenSSH の代わりに paramiko を使用して接続してください。これは ansible.cfg でグローバルに行うこともできますし、inventory/group/host 変数として設定することもできます。以下に例を示します。
[freebsd]
mybsdhost1 ansible_connection=paramiko
BSD のブートストラップ
Ansible はデフォルトでエージェントレスですが、管理ノードで Python が必要になります。raw モジュールのみが Python なしで動作します。このモジュールを使用して Ansible をブートストラップして BSD バリアントに Python をインストールできます (下記参照) が、Python は非常に制限されており、Ansible の機能を完全に活用するには Python を使用する必要があります。
次の例では、Ansible の完全な機能に必要な json ライブラリーを含む Python をインストールしています。コントロールマシンでは、ほとんどのバージョンの FreeBSD で次のように実行できます。
ansible -m raw -a "pkg install -y python" mybsdhost1
OpenBSD の場合は、次のコマンドを使用します。
ansible -m raw -a "pkg_add python%3.8"
これが完了すると、raw モジュール以外の他の Ansible モジュールを使用できるようになります。
注釈
この例では、FreeBSD では pkg を、OpenBSD では pkg_add を使用していますが、お使いの BSD に合わせて適切なパッケージツールを選択してください。また、パッケージ名も異なる場合があります。インストールする Python パッケージ名については、使用している BSD のパッケージリストやドキュメントを参照してください。
Python インタープリターの設定
さまざまな Unix 系オペレーティングシステムやディストリビューションをサポートするために、Ansible は常に既存の環境変数や env 変数を頼りに正しい Python バイナリーを探すことはできません。デフォルトでは、モジュールは最も一般的な場所である /usr/bin/python を指します。BSD 系では、このパスが異なる場合があるので、バイナリーの場所を Ansible に知らせることが推奨されます。INTERPRETER_PYTHON を参照してください。たとえば、ansible_python_interpreter インベントリー変数を設定します。
[freebsd:vars]
ansible_python_interpreter=/usr/local/bin/python
[openbsd:vars]
ansible_python_interpreter=/usr/local/bin/python3.8
FreeBSD パッケージおよびポート
FreeBSD では、/usr/local/bin/python 実行可能ファイルまたは実行可能ファイルへのリンクのいずれかがデフォルトでインストールされる保証はありません。Ansible に関連してリモートホストのベストプラクティスは、少なくともAnsible がサポートする Python バージョン(例:lang/python38 および lang/python3 と lang/python 両方のメタポート)をインストールすることです。/usr/ports/lang/python3/pkg-descr からの引用:
This is a meta port to the Python 3.x interpreter and provides symbolic links
to bin/python3, bin/pydoc3, bin/idle3 and so on to allow compatibility with
minor version agnostic python scripts.
/usr/ports/lang/python/pkg-descr からの引用:
This is a meta port to the Python interpreter and provides symbolic links
to bin/python, bin/pydoc, bin/idle and so on to allow compatibility with
version agnostic python scripts.
これにより、以下のパッケージがインストールされます。
shell> pkg info | grep python
python-3.8_3,2 "meta-port" for the default version of Python interpreter
python3-3_3 Meta-port for the Python interpreter 3.x
python38-3.8.12_1 Interpreted object-oriented programming language
さらに、以下の実行ファイルとリンクがインストールされます。
shell> ll /usr/local/bin/ | grep python
lrwxr-xr-x 1 root wheel 7 Jan 24 08:30 python@ -> python3
lrwxr-xr-x 1 root wheel 14 Jan 24 08:30 python-config@ -> python3-config
lrwxr-xr-x 1 root wheel 9 Jan 24 08:29 python3@ -> python3.8
lrwxr-xr-x 1 root wheel 16 Jan 24 08:29 python3-config@ -> python3.8-config
-r-xr-xr-x 1 root wheel 5248 Jan 13 01:12 python3.8*
-r-xr-xr-x 1 root wheel 3153 Jan 13 01:12 python3.8-config*
INTERPRETER_PYTHON_FALLBACK
バージョン 2.8 以降、Ansible には、Python を検索するパスの一覧を指定するための便利な変数 ansible_interpreter_python_fallback が用意されています。「INTERPRETER_PYTHON_FALLBACK」を参照してください。この一覧を検索し、見つかった最初の項目が使用されます。たとえば、以下の設定では、前のセクションのメタポートのインストールが冗長になります。つまり、Python メタポートをインストールしないと、リストの最初の 2 つの項目が省略され、/usr/local/bin/python3.8 が検出されます。
ansible_interpreter_python_fallback=['/usr/local/bin/python', '/usr/local/bin/python3', '/usr/local/bin/python3.8']
Python の下位バージョンで延ばされているこの変数を使い、例えば``group_vars/all``に入れます。そして、必要に応じて``group_vars/{group1, group2, ...}``の特定グループに対して、また``host_vars/{host1, host2, ...}``の特定ホストに対して、オーバーライドします。:ref:`ansible_variable_precedence`を参照してください。
Python の検出のデバッグ
たとえば、以下のインベントリーを想定します。
shell> cat hosts
[test]
test_11
test_12
test_13
[test:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_become_user=root
ansible_become_method=sudo
ansible_interpreter_python_fallback=['/usr/local/bin/python', '/usr/local/bin/python3', '/usr/local/bin/python3.8']
ansible_perl_interpreter=/usr/local/bin/perl
以下のPlaybook により、
shell> cat playbook.yml
- hosts: test_11
gather_facts: false
tasks:
- command: which python
register: result
- debug:
var: result.stdout
- debug:
msg: |-
{% for i in _vars %}
{{ i }}:
{{ lookup('vars', i)|to_nice_yaml|indent(2) }}
{% endfor %}
vars:
_vars: "{{ query('varnames', '.*python.*') }}"
詳細が表示されます。
shell> ansible-playbook -i hosts playbook.yml
PLAY [test_11] *******************************************************************************
TASK [command] *******************************************************************************
[WARNING]: Platform freebsd on host test_11 is using the discovered Python interpreter at
/usr/local/bin/python, but future installation of another Python interpreter could change the
meaning of that path. See https://docs.ansible.com/ansible-
core/2.12/reference_appendices/interpreter_discovery.html for more information.
changed: [test_11]
TASK [debug] *********************************************************************************
ok: [test_11] =>
result.stdout: /usr/local/bin/python
TASK [debug] *********************************************************************************
ok: [test_11] =>
msg: |-
ansible_interpreter_python_fallback:
- /usr/local/bin/python
- /usr/local/bin/python3
- /usr/local/bin/python3.8
discovered_interpreter_python:
/usr/local/bin/python
ansible_playbook_python:
/usr/bin/python3
リストの最初のアイテム ansible_interpreter_python_fallback が FreeBSD リモートホストで検出されていることが分かります。変数 ansible_playbook_python は、Playbook を実行した Linux コントローラーで Python へのパスを保持します。
警告に関して、:ref:`INTERPRETER_PYTHON`からの引用
The fallback behavior will issue a warning that the interpreter
should be set explicitly (since interpreters installed later may
change which one is used). This warning behavior can be disabled by
setting auto_silent or auto_legacy_silent. ...
変数 ansible_python_interpreter=auto_silent を設定することで、これを無視するか、または取り除くことができます。これは、実際に /usr/local/bin/python を使用して希望するものだからです(「後でインストールされるインタープリターにより、使用されるものが変わる場合があります」)。以下に例を示します。
shell> cat hosts
[test]
test_11
test_12
test_13
[test:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_become_user=root
ansible_become_method=sudo
ansible_interpreter_python_fallback=['/usr/local/bin/python', '/usr/local/bin/python3', '/usr/local/bin/python3.8']
ansible_python_interpreter=auto_silent
ansible_perl_interpreter=/usr/local/bin/perl
追加の変数
Ansible でバンドルされているプラグイン以外のプラグインを使用する場合は、プラグインの記述方法に応じて bash、perl、または ruby に同様の変数を設定できます。
[freebsd:vars]
ansible_python_interpreter=/usr/local/bin/python
ansible_perl_interpreter=/usr/local/bin/perl
利用可能なモジュール
Ansible のコアモジュールの大半は、Unix 系マシンと他の汎用サービスを組み合わせて記述されているため、Linux に限定したテクノロジー (LVG など) を対象とするものを除き、その大半が BSD 上で正常に機能します。
コントロールノードとしての BSD の使用
BSD をコントロールマシンとして使用することは、BSD バリアントの Ansible パッケージをインストールするか、pip または「from source」の指示に従うのと同じくらい簡単です。
BSD ファクト
Ansible は、Linux マシンと同様の方法で BSD からファクトを収集しますが、データ、名前、構造は、ネットワーク、ディスク、およびその他のデバイスにより異なる可能性があるため、BSD 管理者にとっては出力が多少異なるもののまだ馴染みがあることが期待できます。
BSD の取り組みおよび貢献
BSD サポートは Ansible にとって重要です。貢献者の大半は Linux を使用していますが、Ansible には活発な BSD コミュニティーがあり、可能な限り BSD フレンドリーであるように努めています。BSD に関する問題や非互換性を発見した場合は、遠慮なくご報告ください。
参考
- アドホックコマンドの概要
基本コマンドの例
- Playbook の操作
Ansible の設定管理言語の概要
- モジュール開発の必要性
モジュールの書き方
- Mailing List
ご質問はございますか。サポートが必要ですか。ご提案はございますか。Google グループの一覧をご覧ください。
- リアルタイムチャット
Ansible チャットチャンネルへの参加方法