3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ansible】selectattrフィルターの使い方まとめ

Last updated at Posted at 2025-07-01

Ansibleでselectattr フィルターのよく使う演算子とそのユースケースを紹介します。

selectattrの基本構文

{{ list | selectattr('attribute', 'operator', 'value') | list }}
  • attribute: 対象のキー名
  • operator: 比較演算子(例: equalto, defined, matchなど)
  • value: 比較対象の値(必要に応じて)

演算子一覧と説明

演算子     説明                        
equalto  等しい                        status == 'active'
defined  属性が定義されているか        email is defined
match    正規表現に完全一致            name match '^A.*'
search   正規表現で部分一致            name search 'li'
in       リストや文字列に含まれるか    role in ['admin', 'manager']
lt       より小さい                    age < 30
le       以下                          age <= 30
gt       より大きい                    age > 40
ge       以上                          age >= 40

ユースケースを満たすサンプルデータ

以下の users リストは、上記の演算子をすべてテストできるように設計されています。

users:
  - name: Alice
    status: active
    email: alice@example.com
    role: admin
    age: 25

  - name: Bob
    status: inactive
    role: user
    age: 30

  - name: Charlie
    status: active
    email: charlie@example.com
    role: manager
    age: 35

  - name: David
    status: active
    email: david@example.com
    role: guest
    age: 40

  - name: Eve
    status: inactive
    email: eve@example.com
    role: admin
    age: 45

  - name: Frank
    status: active
    role: user
    age: 50

  - name: Olivia
    status: active
    email: olivia@example.com
    role: manager
    age: 60

各演算子の実行例・出力・解説

1. equalto

- name: Select users with status == 'active'
  debug:
    msg: "{{ users | selectattr('status', 'equalto', 'active') | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    },
    {
      "name": "Charlie",
      "status": "active",
      "email": "charlie@example.com",
      "role": "manager",
      "age": 35
    },
    {
      "name": "David",
      "status": "active",
      "email": "david@example.com",
      "role": "guest",
      "age": 40
    },
    {
      "name": "Frank",
      "status": "active",
      "role": "user",
      "age": 50
    },
    {
      "name": "Olivia",
      "status": "active",
      "email": "olivia@example.com",
      "role": "manager",
      "age": 60
    }
  ]
}
  • 対象キー名: status
  • 演算子: equalto
  • 比較対象の値: 'active'
  • 解説: status'active' のユーザーのみを抽出しています。Alice, Charlie, David, Frank, Olivia の5人が該当します。

2. defined

- name: Select users with email defined
  debug:
    msg: "{{ users | selectattr('email', 'defined') | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    },
    {
      "name": "Charlie",
      "status": "active",
      "email": "charlie@example.com",
      "role": "manager",
      "age": 35
    },
    {
      "name": "David",
      "status": "active",
      "email": "david@example.com",
      "role": "guest",
      "age": 40
    },
    {
      "name": "Eve",
      "status": "inactive",
      "email": "eve@example.com",
      "role": "admin",
      "age": 45
    },
    {
      "name": "Olivia",
      "status": "active",
      "email": "olivia@example.com",
      "role": "manager",
      "age": 60
    }
  ]
}
  • 対象キー名: email
  • 演算子: defined
  • 比較対象の値: なし
  • 解説: email キーが存在するユーザーのみを抽出しています。BobFrank には email が定義されていないため除外されます。

3. match

- name: Select users whose name starts with 'A'
  debug:
    msg: "{{ users | selectattr('name', 'match', '^A.*') | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    }
  ]
}
  • 対象キー名: name
  • 演算子: match
  • 比較対象の値: '^A.*'
  • 解説: nameA で始まるユーザーを抽出しています。正規表現 ^A.* に一致するのは Alice のみです。

4. search

- name: Select users whose name contains 'li'
  debug:
    msg: "{{ users | selectattr('name', 'search', 'li') | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    },
    {
      "name": "Charlie",
      "status": "active",
      "email": "charlie@example.com",
      "role": "manager",
      "age": 35
    },
    {
      "name": "Olivia",
      "status": "active",
      "email": "olivia@example.com",
      "role": "manager",
      "age": 60
    }
  ]
}
  • 対象キー名: name
  • 演算子: search
  • 比較対象の値: 'li'
  • 解説: name'li' を含むユーザーを抽出しています。Alice, Charlie, Olivia の3人が該当します。

5. in

- name: Select users with role in ['admin', 'manager']
  debug:
    msg: "{{ users | selectattr('role', 'in', ['admin', 'manager']) | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    },
    {
      "name": "Charlie",
      "status": "active",
      "email": "charlie@example.com",
      "role": "manager",
      "age": 35
    },
    {
      "name": "Eve",
      "status": "inactive",
      "email": "eve@example.com",
      "role": "admin",
      "age": 45
    },
    {
      "name": "Olivia",
      "status": "active",
      "email": "olivia@example.com",
      "role": "manager",
      "age": 60
    }
  ]
}
  • 対象キー名: role
  • 演算子: in
  • 比較対象の値: ['admin', 'manager']
  • 解説: role'admin' または 'manager' のユーザーを抽出しています。該当するのは Alice, Charlie, Eve, Olivia の4人です。

6. lt

- name: Select users with age < 30
  debug:
    msg: "{{ users | selectattr('age', 'lt', 30) | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    }
  ]
}
  • 対象キー名: age
  • 演算子: lt
  • 比較対象の値: 30
  • 解説: age が30未満のユーザーを抽出しています。該当するのは Alice(25歳)のみです。

7. le

- name: Select users with age <= 30
  debug:
    msg: "{{ users | selectattr('age', 'le', 30) | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Alice",
      "status": "active",
      "email": "alice@example.com",
      "role": "admin",
      "age": 25
    },
    {
      "name": "Bob",
      "status": "inactive",
      "role": "user",
      "age": 30
    }
  ]
}
  • 対象キー名: age
  • 演算子: le
  • 比較対象の値: 30
  • 解説: age が30以下のユーザーを抽出しています。Alice(25歳)と Bob(30歳)が該当します。

8. gt

- name: Select users with age > 40
  debug:
    msg: "{{ users | selectattr('age', 'gt', 40) | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "Eve",
      "status": "inactive",
      "email": "eve@example.com",
      "role": "admin",
      "age": 45
    },
    {
      "name": "Frank",
      "status": "active",
      "role": "user",
      "age": 50
    },
    {
      "name": "Olivia",
      "status": "active",
      "email": "olivia@example.com",
      "role": "manager",
      "age": 60
    }
  ]
}
  • 対象キー名: age
  • 演算子: gt
  • 比較対象の値: 40
  • 解説: age が40より大きいユーザーを抽出しています。Eve(45歳)、Frank(50歳)、Olivia(60歳)が該当します。

9. ge

- name: Select users with age >= 40
  debug:
    msg: "{{ users | selectattr('age', 'ge', 40) | list }}"
ok: [localhost] => {
  "msg": [
    {
      "name": "David",
      "status": "active",
      "email": "david@example.com",
      "role": "guest",
      "age": 40
    },
    {
      "name": "Eve",
      "status": "inactive",
      "email": "eve@example.com",
      "role": "admin",
      "age": 45
    },
    {
      "name": "Frank",
      "status": "active",
      "role": "user",
      "age": 50
    },
    {
      "name": "Olivia",
      "status": "active",
      "email": "olivia@example.com",
      "role": "manager",
      "age": 60
    }
  ]
}
  • 対象キー名: age
  • 演算子: ge
  • 比較対象の値: 40
  • 解説: age が40以上のユーザーを抽出しています。David(40歳)も含まれるため、Eve, Frank, Olivia に加えて David も該当します。

✅ まとめ

selectattr フィルターを使えば、Ansibleでのリスト操作が非常に柔軟かつ強力になります。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?