同僚にアクセスを許可する

AnsibleBeginner
オンラインで実践に進む

はじめに

Small Frame Studio では Ava と Noah が準備済みの 2 台のホストで作業し、Maya は既存のアクセスとメモを維持する必要があります。Ansible で対象範囲内のスタッフアカウントを作り、実際の SSH 身元を使い、1 人分の宣言を再利用可能なスタッフ一覧へ変えます。

基本的なターミナル操作と、小さな Ansible インベントリーおよび Playbook を読んだ経験が必要です。この実習は必要な Linux アカウント、SSH 鍵、権限、lookup、ループを使用前に説明します。練習鍵、信頼するホストの身元、個別のコレクションはすべて準備済みです。

Ava がログインして作業できるようにする

このステップではスタジオの 2 台のホストにコースアカウントを作り、その練習鍵を許可し、その身元で実際の作業ファイルを保存します。

Small Frame Studio は web1 と web2 に異なる編集メモを保存しています。Maya はすでに両方で作業しており、Ava のアクセスを追加しても Maya の作業を失ってはいけません。準備済みの対象は練習 VM のカーネルを共有する 2 つの SSH コンテナーであり、独立した VM ではありません。Ansible はコントローラー上で動き、準備済みの automation アカウントで接続します。スタッフアカウントはこれらのコース対象の内部だけに存在します。

Controller を開きます。開始場所はプロジェクトディレクトリーです。誤ったディレクトリーへ移動した場合も、次のコマンドで戻れます。

cd /home/labex/project

ファイルを変更せず表示する cat で、インベントリーと承認スタッフデータを読みます。

cat inventory.ini
cat approved-staff.json

最終一覧には両ホスト用の studio_ava と studio_noah があります。最初は Ava から始め、同じ作業を一覧へ広げます。この承認入力、インベントリー、準備済み SSH 設定は変更しないでください。

SSH はリモートホスト上のユーザーを認証します。公開鍵は対象に配置でき、対応する秘密鍵はクライアントに残ってその保持を証明します。ここでの training-keys/ は新しく生成した使い捨ての練習鍵を含み、本物の個人認証情報ではありません。.pub で終わるファイルは公開鍵で、同じ名前からその接尾辞を除いたファイルが秘密鍵です。秘密鍵を対象へコピーしたり、その内容を表示したりしないでください。

準備済みのクライアント設定を読みます。

cat clients.conf

web1-maya などの各別名は、対象、コースユーザー、秘密鍵を選びます。-F clients.conf は ssh にこのプロジェクト設定を使わせます。信頼するホスト鍵を固定し、パスワード要求と接続の再利用を無効にして、選択した身元だけを提示します。対象のホスト鍵はサーバーを識別し、ユーザーの公開鍵は人を許可します。役割は異なります。どちらの信頼確認も無効にしないでください。

最初に正常なスタッフの身元を観察します。単一引用符内のテキストはリモートホストで実行するコマンドです。セミコロンでそこでの 2 つのコマンドを区切り、ユーザーを確認してからローカルの作業ファイルを読みます。

ssh -F clients.conf web1-maya 'id -un; cat work/briefing.txt'

studio_maya と Riverside スタジオのメモが表示されます。新しい接続で別のホストを読みます。

ssh -F clients.conf web2-maya 'id -un; cat work/briefing.txt'

同じ身元ですが、異なる Hill スタジオのメモが表示されます。両ファイルを保ってください。Ava のアカウントと許可はまだないので、次の接続は失敗する想定です。

ssh -F clients.conf web1-ava 'id -un'

パスワード要求ではなく、Permission denied (publickey) と終了ステータス 255 を想定します。接続タイムアウトやホスト鍵の警告は別の問題です。SSH の信頼を弱めず、プロジェクトディレクトリーに戻り、変更していないインベントリーと設定を確認してください。

Linux ユーザーにはホーム、ログインシェル、プライマリーグループがあります。user モジュールはアカウントと、これらの準備済み対象では同名のプライマリーグループを作成します。create_home: true はホームを作ります。become: true は準備済み automation アカウントに許可された権限昇格を対象上で使います。LabEx のログインは変えません。

完全な Playbook を書きます。この here-document では > が指定したコントローラーファイルを置き換え、引用した YAML 区切り文字がシェル展開を防ぎます。終了区切り文字は行頭に単独で置きます。入力を間違えたらブロック全体を実行し直すと、そのファイルを置き換えられます。終了区切り文字がなくシェルが待っている場合、Ctrl+C で未完了入力を取り消し、通常のプロンプトからブロック全体を再実行します。YAML は空白で入れ子を、- でリスト項目を表します。

cat > access.yml <<'YAML'
- name: Give Ava access to the studio hosts
  hosts: all
  become: true
  gather_facts: false
  tasks:
    - name: Create Ava's course account
      ansible.builtin.user:
        name: studio_ava
        shell: /bin/bash
        create_home: true
    - name: Keep Ava's home private
      ansible.builtin.file:
        path: /home/studio_ava
        state: directory
        owner: studio_ava
        group: studio_ava
        mode: '0750'
    - name: Create Ava's work directory
      ansible.builtin.file:
        path: /home/studio_ava/work
        state: directory
        owner: studio_ava
        group: studio_ava
        mode: '0750'
    - name: Authorize Ava's public key
      ansible.posix.authorized_key:
        user: studio_ava
        key: "{{ lookup('file', 'training-keys/ava.pub') }}"
        state: present
YAML

file モジュールはディレクトリーの所有者と権限を管理し、既存作業ファイルの内容は管理しません。0750 は所有者に全権限、プライマリーグループに読み取りと通過、ほかのユーザーには権限なしを与えます。数値を引用すると YAML の数値解釈を避けられます。lookup はコントローラーの公開鍵を読みます。二重の波括弧が式を評価します。state: present はほかの鍵を保ってこの公開鍵を追加し、アカウントの鍵ファイル全体を置き換えません。

ansible.builtin で始まるモジュールは Core に含まれます。ansible.posix.authorized_key は別のコレクションに属し、このプロジェクト用にオフラインで導入済みです。ユーザーの .ssh ディレクトリーをモード 0700、authorized_keys をモード 0600 で作り、そのユーザーとプライマリーグループの所有にします。コレクションの導入や SSH サーバー設定の編集は不要です。

まず YAML/Playbook の構文を確認します。

ansible-playbook access.yml --syntax-check

構文エラーでは報告されたファイルと行を読み、完全なブロックと空白や引用符を比較して書き直し、再確認します。VM のリセットは不要です。初回作成の check mode 予測は信頼できません。前のタスクが作成を予測しただけのアカウントを、後の鍵タスクは使えないためです。まず宣言した作成を適用し、アカウントが存在してから check mode を使います。

ansible-playbook access.yml

両ホストとも接続不能や失敗したタスクがない状態で完了する必要があります。Ava としてログインし、実際の身元を保存します。リモートの引用符内では umask 027 が新規ファイルの権限を最大 0640 に制限し、> が id の出力を到着ファイルへ書き、cat が読み戻します。この設定は今回のリモートコマンドのシェルだけに適用されます。

ssh -F clients.conf web1-ava 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
ssh -F clients.conf web2-ava 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'

どちらも studio_ava を表示します。Ansible の成功要約だけでなく、実際のスタッフログインとファイル書き込みを行いました。Maya の別々のファイルとログインは引き続き利用できなければなりません。

スタッフ一覧に宣言を再利用する

このステップでは、繰り返すアカウント情報を構造化データとループに置き換え、Noah を追加し、既存作業を変更せずに収束を確認します。

Controller の /home/labex/project に留まります。各スタッフ項目にはコースユーザー名と、コントローラー上の公開鍵パスが必要です。準備済みの group_vars ディレクトリーは空です。group_vars/all.yml ファイルは全インベントリーホストに変数を提供します。承認された 2 人の一覧を書きます。

cat > group_vars/all.yml <<'YAML'
staff:
  - name: studio_ava
    key_file: training-keys/ava.pub
  - name: studio_noah
    key_file: training-keys/noah.pub
YAML

対応する host_vars/web1.yml なら web1 だけに一覧を提供でき、ホストの値は共有グループの既定値を上書きします。この単元は両ホストで同じ一覧を使い、challenge では異なる承認ホスト一覧が提供されます。再利用するタスク自体を変える必要はありません。

ループは staff の各項目についてタスクを繰り返します。item.name が現在の名前を、item.key_file がその公開鍵パスを読みます。同じ一覧でアカウント、ディレクトリー、許可を作ります。1 人用 Playbook を再利用可能な版に置き換えます。

cat > access.yml <<'YAML'
- name: Manage the approved studio staff
  hosts: all
  become: true
  gather_facts: false
  tasks:
    - name: Create each course account
      ansible.builtin.user:
        name: "{{ item.name }}"
        shell: /bin/bash
        create_home: true
      loop: "{{ staff }}"
    - name: Keep each home private
      ansible.builtin.file:
        path: "/home/{{ item.name }}"
        state: directory
        owner: "{{ item.name }}"
        group: "{{ item.name }}"
        mode: '0750'
      loop: "{{ staff }}"
    - name: Create each work directory
      ansible.builtin.file:
        path: "/home/{{ item.name }}/work"
        state: directory
        owner: "{{ item.name }}"
        group: "{{ item.name }}"
        mode: '0750'
      loop: "{{ staff }}"
    - name: Add each approved public key
      ansible.posix.authorized_key:
        user: "{{ item.name }}"
        key: "{{ lookup('file', item.key_file) }}"
        state: present
      loop: "{{ staff }}"
YAML

既定の非排他的な鍵の動作を保ちます。ループ中の排他的な鍵操作は、以前の反復の別の正当な鍵を削除することがあります。このプロジェクトは指定鍵を追加し、後で指定の古い鍵を取り除きます。全員の鍵集合全体を置き換えるものではありません。

構文を確認して適用します。Noah はまだ存在しないため、初回作成時の check mode の制約は引き続き当てはまります。

ansible-playbook access.yml --syntax-check
ansible-playbook access.yml

Ava には新たな変更が不要で、Noah が両対象に作られるはずです。項目ごとの結果を読み、両要約が unreachable=0、failed=0 であることを確認します。Noah の実際の身元で本人の作業ファイルを作ります。

ssh -F clients.conf web1-noah 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
ssh -F clients.conf web2-noah 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'

どちらも studio_noah を表示します。Ava の到着ファイルは本人のもので、Maya のメモは変わりません。元の身元からそれぞれ読みます。

ssh -F clients.conf web1-ava 'cat work/arrival.txt'
ssh -F clients.conf web2-ava 'cat work/arrival.txt'
ssh -F clients.conf web1-maya 'cat work/briefing.txt'
ssh -F clients.conf web2-maya 'cat work/briefing.txt'

必要なユーザーがすべて存在します。--check は対応する変更を適用せず予測します。

ansible-playbook access.yml --check

両要約が changed=0、unreachable=0、failed=0 を報告するはずです。実際の宣言を繰り返します。

ansible-playbook access.yml

これも変更なしを報告するはずです。これが宣言したアカウント、ディレクトリー、鍵許可の冪等性です。通常の SSH アクセスでシステムのログインログが書かれることはあります。同じループは実装を書き直さずに別の承認スタッフ一覧を利用できます。

ログインが失敗したら、まず選んだ別名と身元を確認し、公開鍵パスとユーザー名を承認データと比較します。コントローラー宣言を直して再適用してください。秘密鍵を対象にコピーしたり、ホームを全員書き込み可能にしたり、サーバーの信頼確認を無効にしたりして許可不足を直さないでください。

まとめ

コースのアカウント、非公開作業ディレクトリー、公開鍵の許可を作成し、実際の SSH 身元で作業を保存しました。1 人ずつの繰り返しを構造化されたスタッフループに置き換え、既存スタッフのアクセスとメモを保ちながら収束を確認しました。