1. ホーム

[解決済み】Ansibleのplaybookを安全に1台のマシンに限定する?

2022-04-06 01:51:48

質問

Ansibleを使用して、少人数のコンピュータで簡単なユーザー管理タスクを実行しています。現在、私のプレイブックは次のように設定されています。 hosts: all で、hosts ファイルは全マシンがリストアップされた単一のグループだけです。

# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local

私は、1台のマシンをターゲットにすることが頻繁にあることに気づきました。そのため ansible-playbook コマンドは、このようにプレイを制限することができます。

ansible-playbook --limit imac-2.local user.yml

しかし、これでは、特に破壊的な可能性のあるプレイブックでは、ちょっと壊れやすいような気がします。特に破壊的なプレイブックを作るには limit フラグがあると、そのプレイブックはあらゆる場所で実行されることになります。このようなツールはたまにしか使わないので、数カ月後に誤って核攻撃をしてしまわないように、プレイバックを誤魔化す手段を講じる価値はありそうです。

プレイブックの実行を1台のマシンに限定するためのベストプラクティスはありますか?理想的には、プレイブックは、重要なディテールが省かれていても無害であるべきです。

どのように解決するのですか?

プレイブックに直接ホスト名を入力できることがわかったので、プレイブックを実行する際に hosts: imac-2.local は問題なく動作します。でも、ちょっと不格好ですね。

より良い解決策は、変数を使ってplaybookのホストを定義し、特定のホストアドレスを --extra-vars :

# file: user.yml  (playbook)
---
- hosts: '{{ target }}'
  user: ...

プレイブックを実行する

ansible-playbook user.yml --extra-vars "target=imac-2.local"

もし {{ target }} が定義されていない場合、プレイブックは何もしません。必要であれば、hostsファイルからのグループも渡すことができます。全体として、これは潜在的に破壊的なプレイブックを構築するためのはるかに安全な方法のように思えます。

1台のホストを対象としたプレイブック。

$ ansible-playbook user.yml --extra-vars "target=imac-2.local" --list-hosts

playbook: user.yml

  play #1 (imac-2.local): host count=1
    imac-2.local

ホスト群を持つプレイブック。

$ ansible-playbook user.yml --extra-vars "target=office" --list-hosts

playbook: user.yml

  play #1 (office): host count=3
    imac-1.local
    imac-2.local
    imac-3.local

ホストの定義を忘れても大丈夫!

$ ansible-playbook user.yml --list-hosts

playbook: user.yml

  play #1 ({{target}}): host count=0