12

私は Ansible を初めて使用し、ファイルをリモート サーバーにコピーするロールを作成しようとしています。Playbook を実行するたびに、ローカル ファイルに異なる名前を付けることができますが、次のようにリモートで同じ名前にコピーする必要があります。

- name: copy file
  copy:
    src=*.txt
    dest=/path/to/fixedname.txt

Ansible ではワイルドカードを使用できないため、メインの Playbook のタスクを使用して簡単な Playbook を作成すると、次のことができます。

- name: find the filename
    connection: local
    shell: "ls -1 files/*.txt"
    register: myfile

- name: copy file
  copy:
    src="files/{{ item }}"
    dest=/path/to/fixedname.txt
  with_items:
   - myfile.stdout_lines

ただし、タスクをロールに移動すると、最初のアクションが機能しなくなりました。これは、Playbook が「ロール」ディレクトリのルート ディレクトリで実行されている間、相対パスがロールに対して相対的であるためです。ロールのファイル ディレクトリへのパスを追加できますが、もっと洗練された方法はありますか?

4

2 に答える 2

13

ローカルで情報を検索し、その情報をコピー モジュールへの入力として使用するタスクにアクセスする必要があるようです。

ローカル情報を取得するには 2 つの方法があります。

  • 使用してlocal_action:ください。これは、タスクを 127.0.0.1 に対して再度実行することの省略形です。詳細については、こちらを参照してください。(これはあなたが使ってきたものです)

  • を使用しlookupます。これは、ローカルで情報を取得するために特別に設計されたプラグイン システムです。詳細はこちら

あなたの場合、 を使用して 2 番目の方法を使用しlookupます。次の例のように設定できます。

vars:
  local_file_name: "{{ lookup('pipe', 'ls -1 files/*.txt') }}"

tasks:
  - name: copy file
    copy: src="{{ local_file_name }}" dest=/path/to/fixedname.txt    

または、より直接的に:

tasks:
  - name: copy file
    copy: src="{{ lookup('pipe', 'ls -1 files/*.txt') }}" dest=/path/to/fixedname.txt    

パスに関して

ルックアップ プラグインは、タスクのコンテキストから実行されます (プレイブックとロール)。これは、使用する場所によって動作が異なることを意味します。

上記のセットアップでは、タスクは Playbook から直接実行されるため、作業ディレクトリは次のようになります。

/path/to/project-- これは、プレイブックがあるフォルダーです。

タスクをロールに追加する場合、作業ディレクトリは次のようになります。

/path/to/project/roles/role_name/tasks

さらに、fileおよびpipeプラグインは、存在する場合はrole/filesフォルダー内から実行されます。

/path/to/project/roles/role_name/files-- これは、コマンドがls -1 *.txt

警告:

プラグインは、変数にアクセスするたびに呼び出されます。これは、プレイブックで変数をデバッグすることを信頼できないことを意味し、後で役割で使用されるときに変数が同じ値を持つことに依存します!

ただし、プロジェクトの ansible フォルダー内に存在するファイルのユースケースについては疑問に思っていますが、誰の名前が事前に知られていません。そのようなファイルはどこから来たのですか?ファイルの生成とAnsibleでの使用の間にレイヤーを追加することはできませんか...または固定のローカルパスを変数として持つことはできますか? ちょっと興味があるんだけど ;)

于 2014-06-16T21:43:37.943 に答える
8

追加の回答を投げたかっただけです...私はあなたと同じ問題を抱えています。そこで、その場でansibleバンドルを構築し、アーティファクト(rpm)をロールのファイルフォルダーにコピーします。私のrpmにはファイル名にバージョンがあります。

ansible play を実行すると、ファイル名に関係なく、すべての rpm がインストールされます。

with_fileglobansibleのメカニズムを使用してこれを解決しました:

- name: Copy RPMs
  copy: src="{{ item }}" dest="{{ rpm_cache }}"
  with_fileglob: "*.rpm"
  register: rpm_files

- name: Install RPMs
  yum: name={{ item }} state=present
  with_items: "{{ rpm_files.results | map(attribute='dest') | list }}"

検索メカニズムよりも少しきれいだと思います。

于 2016-08-17T18:33:58.587 に答える