我正在嘗試從 CSV 檔案串列(fileglob)中讀取,并且這些檔案具有標準命名約定。只是想使用read_csv
和register
/set_fact
它們讀取CSV檔案到檔案名,這應該是變數名。
這些檔案是
apples.csv
pears.csv
grapes.csv
我試過的,(接近但不正確)
- name: "Read into dynamic variables"
read_csv:
path: "{{ item }}"
with_fileglob:
- "/tmp/fruits/*.csv"
fruit_name: "{{ item | basename | regex_replace('.csv') }}"
register: "fruit_{{ fruit_name }}"
因此,理想情況下,希望將每個 CSV 的內容作為變數的一部分,例如fruit_apples
以后可以在其他游戲中重復使用。
uj5u.com熱心網友回復:
例如,給定檔案
shell> tree fruits/
fruits/
├── apples.csv
├── grapes.csv
└── pears.csv
0 directories, 3 files
shell> cat fruits/apples.csv
red,big,20
green,small,10
shell> cat fruits/grapes.csv
red,big,20
black,small,10
shell> cat fruits/pears.csv
green,big,30
yellow,small,20
閱讀檔案
- read_csv:
fieldnames: color,size,price
path: "{{ item }}"
with_fileglob: "fruits/*.csv"
register: fruit
與其創建變數fruit_*,不如創建一個水果字典更簡單。例如,適當地把宣告放在下面
fruits: "{{ dict(f_keys|zip(f_vals)) }}"
f_vals: "{{ fruit.results|map(attribute='list')|list }}"
f_keys: "{{ fruit.results|map(attribute='item')|
map('basename')|
map('splitext')|
map('first')|list }}"
給
fruits:
apples:
- {color: red, price: '20', size: big}
- {color: green, price: '10', size: small}
grapes:
- {color: red, price: '20', size: big}
- {color: black, price: '10', size: small}
pears:
- {color: green, price: '30', size: big}
- {color: yellow, price: '20', size: small}
完整劇本示例
- hosts: localhost
vars:
fruits: "{{ dict(f_keys|zip(f_vals)) }}"
f_vals: "{{ fruit.results|map(attribute='list')|list }}"
f_keys: "{{ fruit.results|map(attribute='item')|
map('basename')|
map('splitext')|
map('first')|list }}"
tasks:
- read_csv:
fieldnames: color,size,price
path: "{{ item }}"
with_fileglob: "fruits/*.csv"
register: fruit
- debug:
var: fruits
- debug:
var: fruits.apples
uj5u.com熱心網友回復:
這是不可能的。根據注冊變數
" 當你在一個帶有回圈的任務中注冊一個變數時,注冊的變數包含回圈中每個專案的值。在回圈期間放置在變數中的資料結構將包含一個
results
屬性,即來自所有回應的串列模塊。”
因此,您需要在接下來的任務中提取您感興趣的部分。
為了更好地理解行為,我創建了一個小測驗
---
- hosts: localhost
become: false
gather_facts: false
tasks:
- name: Create multiple results and register them
debug:
msg: "{{ item }}"
loop: [A, B, C]
register: result
- name: Show result
debug:
msg: "{{ result }}"
這顯示了等效的行為,因為with_fileglob
它是with_X
樣式回圈。
TASK [Create multiple results and register them] ***
ok: [localhost] => (item=A) =>
msg: A
ok: [localhost] => (item=B) =>
msg: B
ok: [localhost] => (item=C) =>
msg: C
TASK [Show result] *********************************
ok: [localhost] =>
msg:
changed: false
msg: All items completed
results:
- ansible_loop_var: item
changed: false
failed: false
item: A
msg: A
- ansible_loop_var: item
changed: false
failed: false
item: B
msg: B
- ansible_loop_var: item
changed: false
failed: false
item: C
msg: C
進一步問答
- Ansible:如何在單個任務中注冊多個變數?
- 在回圈中注冊多個變數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487941.html
上一篇:從CSV讀取并轉換為字典
下一篇:將.csv檔案讀入二維陣列