web-dev-qa-db-ja.com

Ansible:異なるパスワードのホストでプレイを実行する方法は?

私は現在、Ansibleの使い方を学んでいます。現在、ログインまたはパスワード、あるいはその両方が異なる、新しいサーバーとレガシーサーバーの両方のサーバーがたくさんあります。すべての人が演劇を実行するためのキーアクセスを持っています。

これが私が始めたものです。例hostsファイル:

# legacy and new have different logins (like root and deploy)
[legacy]
serv1
serv2

[new]
serv3
serv4

# different has a different login and password altogether
[different]
serv5

簡単にするために、元々はすべてのマシンでSudo apt-get update && Sudo apt-get upgradeに相当するプレイブックを実行していましたが、ログイン/パスワードが異なるため、ホストごとに複数のプレイブックを作成しました。しかし今、私はDRYそれを出し、彼らのドキュメントに従って役割を見ています。

今、私はこのようなものを持っています。 test/roles/common/tasks/main.ymlファイル:

---
- name: run apt-get update
  apt: update_cache=yes
- name: run apt-get upgrade
  apt: upgrade=yes

Site.ymlファイル:

- name: apply common configuration to all nodes
  hosts: all

  roles:
  - common

ホストファイルでansible_ssh_user=rootまたは...=deployを使用してさまざまなログインを実際に定義できることを理解しています。または、それらをグループ変数に入れます。しかし、さまざまなSudoパスワードについてはどうすればよいですか? [legacy]はrootなので、Sudoは必要ありませんが、[new][different]は必要であり、パスワードが異なります。どうすればよいですか?グループ変数? test/group_vars/new/some_file_with_a_passwd.ymlおよびtest/group_vars/different/some_other_passwd.yml(セキュリティの問題を無視)を作成しますか?

Site.ymlは、異なるパスワードを持つホストまたはパスワードのないホストがあることをどのように認識しますか?

わかりやすくするために編集します。私はSSHアクセスを持っているので、プレイ中に「プレタスク」ステップを実行することは常に機能します(私はキーアクセスを介して接続し、パスワードを介して接続することはありません)。それが次のステップなので、私はセキュリティについて心配していません。今のところ、group_varsを正しく処理したいと思います。問題があるのはSudoエスカレーションです。例えば。 serv1Sudoはroot/password1、serv3 Sudo:deploy/password2、serv5:anotherdeploy/password3の可能性があります

10
risa_risa

通常は、コマンドラインでAnsibleのパスワードプロンプトの後にSudoパスワードを渡します。 --ask-Sudo-password またはその短いエイリアス-KパスワードなしのSudoを持っていないユーザーで実行している場合。これには、Ansibleコードベースのどこにも記録されず、ソース管理に到達しないという利点があります。

ただし、これは単一のプロンプトであり、すべてのホストに適用されるため、実際にはユースケースに適合しません。

ansibe_Sudo_pass変数を代わりに使用して、特定のホストのユーザーにSudoパスワードを提供できます。このshouldは、Sudoパスワードが必要な場合にのみ使用する必要があるため、この変数をパスワードなしのSudoを使用してホストに提供する場合は、無視する必要があります。

ユーザーとパスワードの組み合わせは、すべてのホストではなくグループごとに完全に分割されているように見えるため、資格情報を group vars に入れるのは論理的に理にかなっています。

指摘 by nikobelia この機密データを Ansible's Vaultcredstash または他の何か。

8
ydaetskcoR

さて、ここで2つの質問があります。

異なるSSHキーで異なるホストに接続する方法は?

ホストのセットごとに異なるgroup_varsファイルを作成し、そこに資格情報を設定します。

# group_vars/legacy
---
ansible_ssh_user: myuser
ansible_ssh_key: ~/.ssh/legacy_key.pem

次に、Ansibleは、各ホストがどのグループに属しているかに基づいて、そのように単純な異なるキーを適用します。

特権昇格のためにホストごとに異なる資格情報を使用する方法は?

もう一度、ホストのセットごとに異なるgroup_varsファイルにそれらを貼り付けます。

# group_vars/legacy
---
ansible_become_user: root
ansible_become_pass: "{{ vaulted_legacy_password }}"

次に、キーワードbecome: yesを使用して特権を昇格させると、Ansibleは各グループに適切な資格情報を適用します。すでにrootになっている場合、becomeキーワードは効果がありません。

そして...そこにある{{ vaulted_legacy_password }}変数を参照してください?

ベストプラクティス、およびこのコードを共有している場合にのみ賢明なことは、 Ansible Vault ファイルを作成し、そこにパスワードを保持することです。 。 Ansible Vaultパスワードは機密変数を保護し、実行時にそれらを復号化できるようにします。

group_vars/legacyファイル全体をボールトにするか(資格情報がその中の唯一の情報である場合)、1つのプレーンテキストファイルと1つの暗号化ファイルを含むgroup_vars/legacyフォルダーを作成できます。 group_varsのサブディレクトリ内のすべてのファイルがソースされ、フォルダの名前でグループに適用されます。

5
nikobelia