ぴよ丸水産

週末ファゴッティストによる技術ブログ

【Ansible】read_csv使ってみた(ヘッダーなし)

はじめに

Ansible2.8で追加されたread_csv使ってみました。
タブ区切りのcsvを読み込んで、
変数に入れ込んで、
with_itemsでループしてみました。

環境

Ansible:2.8

やろうとしたこと

以下のような形式のcsv(タブ区切り)を読み込んで、

[ファイル名] [コマンド]

リモートホストに、
[コマンド] > (パス)/[ファイル名]
を実行します。
つまりコマンド実行結果をリダイレクトさせます。

ってするplaybookです。
あとで出力したファイルたちを、
fetchするまでが目的ですが、
とりあえずこの記事ではファイルを出力するまでに留めておきます。

やってみた

rolesに作る前提で書いてます。

  • tasks/main.yml
 - name: make directory
    file:
      path: {{ output_dir }}
      state: directory

 - name: read csv file
    read_csv:
      path: {{ role_path }}/files/cmdlist.csv
      delimiter: "¥t"
      fieldnames: filename,command
    register: file_cmd
    deligate_to: local host

 - name: exec command and write file
    shell: "{{ item.command }} > {{ output_dir }}/{{ item.filename }}"
    with_items: "{{ file_cmd.list }}"
  • defaults/main.yml
output_dir: '/tmp/{{ ansible_hostname }}'

読み込んだCSVは以下のようなもの。(タブ区切り)

  • files/cmdlist.csv
01_os cat /etc/redhat-release
02_cpu cat /proc/cpuinfo
03_mem cat /proc/meminfo

ポイント

上記のように、ヘッダなしのCSVを読み込んだ場合、
fieldnamesで指定した値が、CSVのカラムのヘッダーになって、
リストとして生成されます。

そのため、registerで拾ってくると、以下のような形で入っています。

        "list": [
            {
                "filename": "01_os", 
                "command": "cat /etc/redhat-release"
            }, 
            {
                "filename": "02_cpu", 
                "command": "cat /proc/cpuinfo"
            }
            {
                "filename": "03_mem", 
                "command": "cat /proc/meminfo"
            }
        ]

なので、呼び出すときは、with_itemsで呼べます。
read_csvモジュールでkeyを指定すると、
dict型になって出てくるようです。
その場合は呼び出し方が違ってくるので注意ですね。
試す機会があれば、書きます。

まとめ

なかなか素敵なモジュールかと思います!
もともとCSVを読み込んでパラメータ流し込む感じの
別のツールを運用してたけど、
Ansibleにしちゃいたいなぁ~とか、
現場でありがちなニーズに応えてくれそうだと思いました。

参考

tekunabe.hatenablog.jp