■ はじめに
ファイルの内容や変数に改行が含まれている場合、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()
で、改行ごとに分割してリストにできることを確認しました。