8

複数のファイルの内容を変数に連結するにはどうすればよいですか?

問題は次のとおりです。リモート マシンでユーザーの公開鍵を設定しようとしています。ほとんど機能するauthorized_keyドキュメントの例:

- name: Set up authorized_keys for the deploy user
  authorized_key: user=deploy
                  key="{{ item }}"
  with_file:
    - public_keys/doe-jane
    - public_keys/doe-john

しかし、実際には を使用する必要があるexclusive=yesため、更新後、提供されていない公開鍵はすべて削除されます。

が提供されている場合exclusive=yes、最後にリストされた公開鍵のみがファイルに残ります (バグ.ssh/authorized_keysとしても報告されています)。

私の現在のアプローチ:

- name: create empty temporary keys file
  local_action: "shell > /tmp/auth_keys"

- name: concat keys to temporary file
  local_action: "shell echo {{ item }} >> /tmp/auth_keys"
  with_file:
   - public_keys/doe-jane
   - public_keys/doe-john

- name: set up authorized_keys
  authorized_key: user=deploy
                  key="{{ lookup('file', '/tmp/auth_keys') }}"
                  exclusive=yes

これは機能しますが、最初の 2 つのコマンドは常に「changed」を生成します。また、これにはもっとエレガントな解決策が必要だと思います。

では、複数のファイルの内容を変数に連結する方法はありますか? または、このタスクに対する一般的なより良いアプローチはありますか?

4

2 に答える 2

9

最初のオプションに大きな問題はありません。次に、コメントが言及しているchanged_when: Falseように、変更の結果を気にするものではないことを認めるために使用するだけで、有効なオプションになります。

リンクしたGitHubの「問題」に記載されているように、実際の質問のタイトルに答えるには、次のようにルックアップをタスクに直接連結するだけです。

- name: set up authorized_keys
  authorized_key: user=deploy
                  key="{{ lookup('file', 'public_keys/doe-jane') + lookup('file', 'public_keys/doe-john')}}"
                  exclusive=yes

ただし、よりクリーンなオプションは、アセンブル モジュールを使用してキーを連結することです。

これにより、現在のアプローチが次のようなものに変わります。

- name: create concatenated keys file
  local_action: "assemble src=roles/ssh_keys/files/ssh_keys/ dest=/tmp/ssh_keys_file"

- name: set up authorized_keys
  authorized_key: user=deploy
                  key="{{ lookup('file', '/tmp/ssh_keys_file' }}"
                  exclusive=yes

これは、宛先ファイルがまったく変更された場合にのみ変更済みとしてマークされるため、何度も実行すると美しい緑の壁が残ります.

これは、ssh キーがすべてファイルであり、同じフォルダーにあることに依存します (アセンブルは通常、conf.d スタイルの構成を使用しないプログラムの conf.d スタイルのディレクトリを単一の .conf ファイルに変換するために使用されます) が、これはおそらくとにかくそれらを保持する最も賢明な方法。

これの利点は、指定したフォルダーから ssh キーを追加/削除するだけで、タスク自体で明示的に定義されているキーを追加/削除する必要なく、次のプレイで取得されることです。

于 2015-10-09T10:20:35.627 に答える