私は次のファイルを使います:変数ファイル:db.yml
x86_64:
alpine:
version: 3.15.0
debian:
version: 11.3.0
aarch64:
alpine:
version: 3.15.0
debian:
version: 11.3.0
スクリプト: playbook.yml
---
- name: "Playbook"
hosts: localhost
connection: local
gather_facts: no
tasks:
- name: Import variables
ansible.builtin.include_vars:
file: db.yml
name: db
- name: DENUG >>> db
debug:
var: db
- name: DENUG >>> db
debug:
var: db[item].alpine
loop: "{{ db.keys()|list }}"
when: db[item].alpine is defined
出力:
ok: [localhost] => (item=x86_64) => {
"ansible_loop_var": "item",
"db[item].alpine": {
"version": "3.15.0"
},
"item": "x86_64"
}
ok: [localhost] => (item=aarch64) => {
"ansible_loop_var": "item",
"db[item].alpine": {
"version": "3.15.0"
},
"item": "aarch64"
}
これで、次のようにdb.ymlを新しいスタイルに変換しました。
x86_64:
- distribution: alpine
version: 3.15.0
- distribution: debian
version: 11.3.0
aarch64:
- distribution: alpine
version: 3.15.0
- distribution: debian
version: 11.3.0
質問:
次のようなコマンドを実行するには:
- name: DENUG >>> db
debug:
var: db[item].alpine
loop: "{{ db.keys()|list }}"
when: db[item].alpine is defined
出力で使用できるのと同じ結果を得ます。
デフォルトでは、この新しいdb.ymlを繰り返してdb.x86_64.alpine.versionの値を取得する方法
答え1
例えば、
db_list: "{{ dict(_keys|zip(_vals)) }}"
_keys: "{{ db.keys()|list }}"
_vals: "{{ db.values()|map('dict2items')|map('json_query', _query) }}"
_query: "[].{distribution: key, version: value.version}"
与えられた
db_list:
aarch64:
- distribution: alpine
version: 3.15.0
- distribution: debian
version: 11.3.0
x86_64:
- distribution: alpine
version: 3.15.0
- distribution: debian
version: 11.3.0
通常、すべての属性を含むリストを作成します。
db_list: "{{ _val2|zip(_val1)|
map('flatten')|
map('zip', ['version', 'arch', 'distribution'])|
map('map', 'reverse')|
map('community.general.dict') }}"
_dict: "{{ lookup('ansible.utils.to_paths', db) }}"
_val1: "{{ _dict.keys()|map('split', '.')|list }}"
_val2: "{{ _dict.values()|list }}"
与えられた
db_list:
- arch: x86_64
distribution: alpine
version: 3.15.0
- arch: x86_64
distribution: debian
version: 11.3.0
- arch: aarch64
distribution: alpine
version: 3.15.0
- arch: aarch64
distribution: debian
version: 11.3.0
これで、好きなものを選択できます。
- 反復アーキテクチャのサブセット
- debug:
msg: "{{ item }}"
loop: "{{ db_list|selectattr('arch', 'in', ['aarch64', 'x86_64']) }}"
- 繰り返し展開「Debian」
- debug:
msg: "{{ item }}"
loop: "{{ db_list|selectattr('distribution', 'eq', 'debian') }}"
- 「11.3.0」未満のバージョンで繰り返し
- debug:
msg: "{{ item }}"
loop: "{{ db_list|selectattr('version', 'version', '11.3.0', '<') }}"
- アーキテクチャ「aarch64」の配布「alpine」を繰り返し
- debug:
msg: "{{ item }}"
loop: "{{ db_list|selectattr('arch', 'eq', 'aarch64')|
selectattr('distribution', 'eq', 'alpine') }}"