てくなべ (tekunabe)

ansible / network / automation

[Ansible] ファイルや変数内の改行ごとに分割してリストにする splitlines() の使い方

■ はじめに

ファイルの内容や変数に改行が含まれている場合、1行ごとにリストにしてループなどの処理をしたい場合があります。そんなときに利用できるのが、 splitlines() です。split() が引数で指定した文字で分割するのに対して、splitlines() は改行で分割します。

Python をご存知の方であれば、str.splitlines()をイメージしていただけるとわかりやすいと思います。

この記事では簡単な例をもとに使い方をご紹介します。

  • 動作確認環境: Ansible 2.3.0, 2.7.8


準備

読み込む利用するテキストファイル

今回は、以下のテキストファイルを利用します。改行コードは LF です。CR/LFでも問題ありません。

  • local.txt
111
222
333

Playbook

以下のような Playbook を利用します。file lookup pluginで、ローカル(リモートではなく)のファイルをの内容を取得し、splitlines() で改行ごとのリストに変換しています。そのリストでループして、1行ごとに debug モジュールで標準出力させています。

- hosts: testsv
  gather_facts: no

  tasks:
    - name: local file debug
      debug: 
        msg: "{{ item }}"
      with_list: "{{ lookup('file', '/vagrant/local.txt').splitlines() }}"
  • 応用 Tips
    • ローカルではなく、リモートのテキストファイルの内容を利用したい場合は slurp モジュールを利用してください。
    • テキストファイルの内容ではなく、変数の値を利用したい場合は with_list: "{{ myvars.splitlines() }}" などに読み替えてください。
    • Ansible 2.5 以降では、with_list の代わりに loop キーワードも利用できます。

実行結果

それでは Playbook を実行します。

$ ansible-playbook -i inventory splitlinestest.yml 

PLAY [testsv] ******************************************************************

TASK [local file debug] ********************************************************
ok: [testsv] => (item=111) => {
    "msg": "111"
}
ok: [testsv] => (item=222) => {
    "msg": "222"
}
ok: [testsv] => (item=333) => {
    "msg": "333"
}

PLAY RECAP *********************************************************************
testsv                     : ok=1    changed=0    unreachable=0    failed=0 

無事に local.txt の1行ごとのループができました。

■ まとめ

splitlines() で、改行ごとに分割してリストにできることを確認しました。