web-dev-qa-db-ja.com

Ansible:ファイルの内容に変数を設定します

ansible-playbookでec2モジュールを使用しています。変数をファイルの内容に設定したいです。これが私が現在どのようにやっているかです。

  1. ファイル名を持つ変数
  2. catファイルへのシェルタスク
  3. catの結果を使用して、ec2モジュールに渡します。

私のプレイブックの内容の例。

vars:
  Amazon_linux_AMI: "AMI-fb8e9292"
  user_data_file: "base-AMI-userdata.sh"
tasks:
- name: user_data_contents
  Shell: cat {{ user_data_file }}
  register: user_data_action
- name: launch ec2-instance
  local_action:
...
  user_data: "{{ user_data_action.stdout }}"

これを行うにはもっと簡単な方法があると思いますが、Ansibleドキュメントを検索しているときに見つけることができませんでした。

75
TesterJeff

Ansibleで lookups を使用すると、ファイルの内容を取得できます。

user_data: "{{ lookup('file', user_data_file) }}"

警告:この検索は、リモートファイルではなくローカルファイルで機能します。

ドキュメントの完全な例 を次に示します。

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
75
jabclab

Slurpモジュールを使用できます:(提案してくれた@mlissnerに感謝します)

vars:
  Amazon_linux_AMI: "AMI-fb8e9292"
  user_data_file: "base-AMI-userdata.sh"
tasks:
- name: Load data
  Slurp:
    src: "{{ user_data_file }}"
  register: slurped_user_data
- name: Decode data and store as fact # You can skip this if you want to use the right hand side directly...
  set_fact:
    user_data: "{{ slurped_user_data.content | b64decode }}"
9

fetch module を使用して、リモートホストからローカルにファイルをコピーし、 lookup module を使用して、フェッチしたファイルの内容を読み取ることができます。

6
Taha Jahangir

ルックアップはローカルホストでのみ機能します。リモートで作成した変数ファイルから変数を取得する場合は、include_vars:{{ varfile }}を使用します。 {{ varfile }}の内容は{"key":"value"}という形式の辞書である必要があります。コロンの後にスペースを含めると、ansibleが問題を引き起こすことがわかります。

2
DR1979