私は新しい Ansible ユーザーで、シェル スクリプトのコレクションから Ansible プレイブックに切り替えています。現在のユーザー管理システムでは、そのサーバー クラス、場所、環境へのアクセスがユーザーに許可されている (または、そのいずれかがワイルドカード/任意に設定されている) 場合にのみ、そのユーザーをシステムに追加できます。
サーバー クラス、場所、および環境は、次のようなファイル (ルートのみ読み取り/書き込み可能) の形式で、クライアント サーバー自体にローカルに保存されます。
LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"
私が求めているものに似ていると思われる例をいくつか見つけましたが、Ansible クライアントから変数を取得する方法や、ユーザーを追加する前にクラス、場所、環境の 3 つの要件がすべて満たされていることを確認する方法がまだわかりません。次のような変数ファイルを想定しています。
users:
-name: user1
uid: 60001
gid: 60001
class: app
location: any
env: dev
-name: user2
uid: 60002
gid: 60002
class: app
location: dfw
env: prod
私が構成している Ansible クライアントから収集された変数に基づいて、次のようなユーザー モジュール エントリを作成します (実際にこれをどのように実現するかはわからないため、疑似コードに注意してください)。
- user:
name: '{{ item.name }}'
state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
uid: '{{ item.uid }}'
with_items: users
Ansible ロールに依存せず、代わりに Ansible クライアント自体からクラス、場所、環境データを取得したいと考えています。これは、少なくとも部分的には、これが現在使用しているシステムであり、既存の使い慣れたツールを維持しながら Ansible に簡単に移行できるためです。私が探しているものは可能ですか?
答え1
という機能があります地元の事実Ansibleの場合:
「プロパティ」ファイルを次のように変更し、 に保存して
/etc/ansible/facts.d/server_meta.fact
、必要に応じて権限を適用します。[settings] ld_class=app ld_loc=dfw ld_env=prod
次に、プレイブックを実行し、
state
パラメータでこれらの事実を参照します。state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"