21

これらの行を ansible プレイブックに入れることができるものに変えようとしています:

# Install Prezto files
shopt -s extglob
shopt -s nullglob
files=( "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/!(README.md) )
for rcfile in "${files[@]}"; do
    [[ -f $rcfile ]] && ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile##*/}"
done

これまでのところ、次のものがあります。

- name: Link Prezto files
  file: src={{ item }} dest=~ state=link
  with_fileglob:
    - ~/.zprezto/runcoms/z*

私はそれが同じではないことを知っていますが、同じファイルを選択します.with_fileglobはホストマシンを見て、リモートマシンを見てほしい.

これを行う方法はありますか、それともシェルスクリプトを使用する必要がありますか?

4

4 に答える 4

6

Bruce P のソリューションは機能しますが、追加ファイルが必要で、少し面倒です。以下は、純粋な ansible ソリューションです。

最初のタスクは、ファイル名のリストを取得し、files_to_copy に保存します。2 番目のタスクは、指定したパスに各ファイル名を追加し、シンボリック リンクを作成します。

- name: grab file list
  shell: ls /path/to/src
  register: files_to_copy
- name: create symbolic links
  file:
    src: "/path/to/src/{{ item }}"
    dest: "path/to/dest/{{ item }}"
    state: link
  with_items: files_to_copy.stdout_lines
于 2016-06-02T22:04:23.183 に答える
2

ファイル モジュールは実際に、with_fileglob などを使用するときに、ファイルに対して ansible が実行されているサーバーを調べます。リモート マシンにのみ存在するファイルを操作したい場合は、いくつかのことを行うことができます。1 つの方法として、あるタスクでシェル スクリプトをコピーし、次のタスクでそれを呼び出す方法があります。ファイルがまだ存在しない場合にのみスクリプトを実行する方法として、ファイルがコピーされたという事実を使用することもできます。

- name: Copy link script
  copy: src=/path/to/foo.sh
        dest=/target/path/to/foo.sh
        mode=0755
  register: copied_script

- name: Invoke link script
  command: /target/path/to/foo.sh
  when: copied_script.changed

もう 1 つの方法は、シェル モジュールを使用して必要な処理を実行するコマンド ライン全体を作成し、それを呼び出すことです。

- name: Generate links
  shell: find ~/.zprezto/runcoms/z* -exec ln -s {} ~ \;
于 2014-06-11T14:17:39.587 に答える