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キーが存在するユーザーのみを抽出しています。BobとFrankには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.*' - 解説:
nameがAで始まるユーザーを抽出しています。正規表現^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でのリスト操作が非常に柔軟かつ強力になります。