web-dev-qa-db-ja.com

lineinfileモジュールでのファイル名とファイル内容の変数の使用

ファイルの内容を読み取って変数に格納し、まだ存在しない場合は別のファイルに挿入しようとしています。

だから、私がこれを試みようとしている方法は次のとおりです:

# Create a variable that represents the path to the file that you want to read from
ssh_public_key_file: '../../jenkins_master/files/{{ hostvars[inventory_hostname]["environment"] }}/id_rsa.pub'

# Create a variable that represents the contents of this file:
ssh_public_key: "{{ lookup('file', '{{ ssh_public_key_file }}') }}"

次に、これらの変数をAnsibleプレイブックで次のように使用します。

- name: Install SSH authorized key
  lineinfile: create=yes dest=~/.ssh/authorized_keys line=" {{ ssh_public_key }}" mode=0644

しかし、プレイブックを実行しようとすると、次のエラーメッセージが表示されます。

could not locate file in lookup: {{ ssh_public_key_file }}

誰かが解決策を推奨したり、私が間違ったことを提案したりできますか?

おかげで、

セーン

15
Seán

行を次のように変更する必要があります。

# Create a variable that represents the contents of this file:
ssh_public_key: "{{ lookup('file', ssh_public_key_file) }}"

変数と文字列を連結する必要がある場合は、次のようにすることができます。

# Example with two variables
ssh_public_key: "{{ lookup('file', var_1+var_2) }}"

# Example with string and variable
ssh_public_key: "{{ lookup('file', '~/config/'+var_1) }}"

。 。

25
ByteNudger

まず、あなたのssh_public_key_file変数が正しく設定されています。次のようなタスクを追加すると、何が表示されますか?

- name: display variable
  debug: var=ssh_public_key_file

出力が次のように見える場合、変数は適切に定義されていません(たとえば、「環境」ファクトがホストに存在しない)。

ok: [localhost] => {
    "ssh_public_key_file": "../../jenkins_master/files/{{ hostvars[inventory_hostname][\"environment\"] }}/id_rsa.pub"
}

ただし、すべてが適切に定義されている場合、出力には変数が正しい値に置き換えられたことが表示されます。

ok: [localhost] => {
    "ssh_public_key_file": "../../jenkins_master/files/foo/id_rsa.pub"
}

あなたがそれを確認したら、私はあなたのssh_public_key変数。デバッグモジュールを使用してその値を出力するだけです。公開鍵ファイルの内容として表示されます。

私が強くお勧めするもう1つのことは、lineinfileをまったく使用しないことです。 SSHキーを使用しているため、代わりに authorized_key モジュールを使用することをお勧めします。これは、authorized_keysファイルを管理するよりクリーンな方法です。

1
Bruce P