私の同僚と私は、Ansible を使用してサーバーのグループを管理しています。
ローカル ホーム ディレクトリの .ansible.cfg ファイルを使用してローカル環境を設定し、プレイブックを Git リポジトリに保存します。
サーバーに認証する際、私は user1 を使用し、彼は user2 を使用します。当社のサーバーの 95% にはこれらのアカウントがありますが、歴史的理由により、いくつかのサーバーには「ユーザー」アカウントしかありません。
問題となっている少数のサーバーに対して、host_vars を使用して remote_user 変数を設定しています。
ただし、私たちのプレイブックでは、通常、対象とするサーバーを指定するために「all」を使用し、コマンドラインで --limit パラメータを使用して、更新を取得するサーバーを正確に指定します。私たちのサーバー ファームは、数年後に廃止されるまでオンラインのままにしておく必要のある、エンジニアリングが不十分なサーバーの寄せ集めであり、このアプローチが私たちのニーズに最も適していることがわかりました。
問題は、remote_user パラメータが .ansible.cfg ファイルに設定されており、スクリプト変数ではなく環境変数として公開されていることです。
つまり、タスクに次の内容が含まれている場合:
remote_user: "{{ remote_user }}"
その変数が定義されているホストに対してのみ機能します
この変数を定義していないホストの 95% では、タスクは失敗します。
変数が定義されている場合にのみそれを使用する方法はありますか?
例えば
remote_user が定義されている場合はそれを使用し、定義されていない場合は .ansible.cfg で設定された環境変数を使用します。
注: 次のものが使用できることがわかっています:
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
タスク定義では、それはそのタスクにのみ適用され、すべてのタスクを更新する必要はありません。
本当に必要なのは、その条件がホストの定義で利用可能になることです。つまり、
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
しかし、それはAnsibleでは違法です
答え1
いつものように、ここで質問をするのを 2 時間延期した後、質問を投稿してから 5 分後に答えを見つけました。
とても簡単です。既存のプレイブックに大量のハックを適用せずに、個々のシステムに異なる remote_user を設定するには、インベントリ内のホストに変数を追加するだけです。
[web_servers]
server1 ansible_ssh_user=user
server2
この例では、プレイに server1 が含まれる場合は常に、ssh ユーザーとして「user」が使用されます。server2 の場合は、ansible.cfg ファイルの remote_user の値が使用されます (例: ローカル環境に応じて user1、user2 など)。