web-dev-qa-db-ja.com

コマンド出力をAnsibleの配列に保存する方法は?

基本的に、Linuxでansibleを使用して「ワイルドカードファイル名」を処理できるようにしたいと考えています。本質的に、これは、ファイル名の一部の後に「*」が続くlsコマンドを使用して、特定のファイルのみを一覧表示することを意味します。

ただし、複数のファイル名が返される可能性があるため、出力を変数に適切に格納できません。したがって、1つのタスク中に配列にいくつあっても、これらの結果を保存できるようにしたいと思います。次に、後のタスクで配列からすべての結果を取得できるようにしたいと思います。さらに、返される可能性のあるファイルの数がわからないため、ファイル名ごとにタスクを実行することはできず、配列の方が理にかなっています。

この背後にある理由は、ランダムな保存場所に頻繁に変更されるファイルがありますが、それらは常に前半が同じであるためです。ランダムなのは彼らの名前の後半であり、私はそれをansibleにハードコーディングする必要はまったくありません。

Ansibleで配列を適切に実装/操作する方法がまったくわからないため、次のコードは、私が「実行しようとしている」ことの例です。明らかに、複数のファイル名が返された場合、意図したとおりに機能しません。そのため、このトピックについて支援を求めていました。

- hosts: <randomservername>
  remote_user: remoteguy
  become: yes
  become_method: Sudo
  vars:
    aaaa: b
  tasks:

 - name: Copy over all random file contents from directory on control node to target clients.  This is to show how to manipulate wildcard filenames.
    copy:
      src: /opt/home/remoteguy/copyable-files/testdir/
      dest: /tmp/
      owner: remoteguy
      mode: u=rwx,g=r,o=r
    ignore_errors: yes

  - name: Determine the current filenames and store in variable for later use, obviously for this exercise we know part of the filenames.
    Shell: "ls {{item}}"
    changed_when: false
    register: annoying
    with_items: [/tmp/this-name-is-annoying*, /tmp/this-name-is-also*]

  - name: Run command to cat each file and then capture that output.
    Shell: cat {{ annoying }}
    register: annoying_words

  - debug: msg=Here is the output of the two files.  {{annoying_words.stdout_lines }}

  - name: Now, remove the wildcard files from each server to clean up.
    file:
      path: '{{ item }}'
      state: absent
    with_items:
    - "{{ annoying.stdout }}"

YAML形式が少し混乱していることは理解していますが、修正された場合、これは正常に実行され、探している出力が得られません。したがって、50個のファイルがある場合、ansibleでそれらすべてを操作したり、すべて削除したりできるようにしたいと思います。

ここにいる誰かが、上記のテストコードフラグメントの配列を適切に利用する方法を教えてくれたら、それは素晴らしいことです!

6
Viscosity

Ansibleは、Shellおよびcommandアクションモジュールの出力をstdoutおよびstdout_lines変数に格納します。後者には、リスト形式の標準出力の個別の行が含まれています。

要素を反復処理するには、次を使用します。

with_items:
  - "{{ annoying.stdout_lines }}"

ls出力を解析すると、問題が発生する場合があることを覚えておく必要があります。

7
techraf

以下のように試してみてください。

- name: Run command to cat each file and then capture that output.
   Shell: cat {{ item.stdout_lines }}
   register: annoying_words
   with_items:
    - "{{ annoying.results }}"
0
smily

annoying.stdout_linesはすでにリストです。

stdout_lines のドキュメントから

Stdoutが返されると、Ansibleは常に文字列のリストを提供します。各文字列には、元の出力の1行に1つの項目が含まれています。

リストを別の変数に割り当てるには、次のようにします。

    ..
      register: annoying
    - set_fact:
        varName: "{{annoying.stdout_lines}}"
    # print first element on the list
    - debug: msg="{{varName | first}}"
0
Marinos An