これは Ansible Advent Calendar 2020 (Adventar版) の 8日目の記事です。
はじめに
Ansible ではループ処理する際に、with_sequence や range によって、連番を生成できます。
たとえば、user1、user2....user99 のようにユーザーを作成したいときに便利です。
通常は単一の範囲しか指定できませんが、工夫すると 101〜105 と 201〜205 のように、複数の範囲の連番を指定できます。
印刷範囲のページ数を指定するようなイメージです。
この記事では簡単なサンプルでご紹介します。
- 動作確認環境
- Ansible 2.9.14
サンプル Playbook
user101 〜 user105 と user201 〜 user205 を表示する Playbook です。
--- - hosts: localhost gather_facts: false connection: local tasks: - name: debug seq debug: msg: "user{{ item }}" with_items: - "{{ range(101, 105 + 1) | list }}" - "{{ range(201, 205 + 1) | list }}"
101 〜 105 の range と 201 〜 205 の range をリストで定義して、with_items で flatten することで、複数の範囲の連番を指定できます。この書き方の場合は、with_items は loop に置き換えられませんのでご注意ください(参考)。
loop にしたい場合は、以下のような書き方にします。
#...(略)... - name: debug seq debug: msg: "user{{ item }}" loop: "{{ (range(101, 105 + 1) | list) + (range(201, 205 + 1) | list) }}"
実行結果
Playbook を実行します。
$ ansible-playbook -i localhsot, loop.yml PLAY [localhost] **************************************************************************************************** TASK [debug seq] **************************************************************************************************** ok: [localhost] => (item=101) => { "msg": "user101" } ok: [localhost] => (item=102) => { "msg": "user102" } ok: [localhost] => (item=103) => { "msg": "user103" } ok: [localhost] => (item=104) => { "msg": "user104" } ok: [localhost] => (item=105) => { "msg": "user105" } ok: [localhost] => (item=201) => { "msg": "user201" } ok: [localhost] => (item=202) => { "msg": "user202" } ok: [localhost] => (item=203) => { "msg": "user203" } ok: [localhost] => (item=204) => { "msg": "user204" } ok: [localhost] => (item=205) => { "msg": "user205" } PLAY RECAP ********************************************************************************************************** localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
user101 〜 user105 と user201 〜 user205 が表示されました。