Ansible - サーバークラスの条件が満たされた場合のユーザー作成

Ansible - サーバークラスの条件が満たされた場合のユーザー作成

私は新しい 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') }}"
    

関連情報