てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 複数の範囲の連番でループする(例: 101 〜 105, 201 〜 205)

これは Ansible Advent Calendar 2020 (Adventar版) の 8日目の記事です。

はじめに

Ansible ではループ処理する際に、with_sequencerange によって、連番を生成できます。

たとえば、user1user2....user99 のようにユーザーを作成したいときに便利です。

通常は単一の範囲しか指定できませんが、工夫すると 101〜105201〜205 のように、複数の範囲の連番を指定できます。

印刷範囲のページ数を指定するようなイメージです。

この記事では簡単なサンプルでご紹介します。

  • 動作確認環境
    • Ansible 2.9.14

サンプル Playbook

user101user105user201user205 を表示する 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 }}"

101105 の range と 201205 の range をリストで定義して、with_items で flatten することで、複数の範囲の連番を指定できます。この書き方の場合は、with_itemsloop に置き換えられませんのでご注意ください(参考)。

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   

user101user105user201user205 が表示されました。