【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にしちゃいたいなぁ~とか、
現場でありがちなニーズに応えてくれそうだと思いました。