Ansible:変数をファイルコンテンツに設定


93

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

  1. ファイル名を持つVar
  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のドキュメントを検索しているときに見つけられませんでした。


これは私のために働いた。lookup(pipe)コマンドに変数を埋め込む方法が見つかりませんでした。
ericson.cepeda

回答:


91

Ansibleでルックアップを使用して、ファイルのコンテンツを取得できます。例:

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 }}"

90
cat@TesterJeffの例のコマンドがリモートマシンで実行されている間、ルックアップはローカルで実行されることに注意してください。
Alex Dupuy 2014年

8
リモートルックアップについては、slurpおよびfetchモジュールをチェックしてください
Marco Ferrari、

15

あなたは使うことができ吸い込み (それを示唆ため@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 }}"

8

フェッチモジュールを使用してリモートホストからローカルにファイルをコピーし、ルックアップモジュールを使用してフェッチしたファイルのコンテンツを読み取ることができます。


6
私はansibleにまったく慣れていませんが、これにslurpを使用してみませんか?リモートでファイルの内容を取り込むように動作するようです。
mlissner 2016

0

lookupはlocalhostでのみ機能します。リモートで作成した変数ファイルから変数を取得する場合は、include_vars:を使用します{{ varfile }}。の内容は{{ varfile }}の形式の辞書である {"key":"value"}必要があります。コロンの後にスペースを含めると、問題が発生する可能性があります。


7
これはナンセンスです。include_varsターゲット上のファイルではなく、制御マシン上でローカルに動作します。
techraf 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.