Файл Var ./iterate_hosts.yml
---
hostlist:
- host: '2019'
inventory_name: 'Level 1'
ip: '2019'
mac: 'All industries'
- host: '2020'
inventory_name: 'Level 2'
ip: '2020'
mac: 'All industries'
- host: '2021'
inventory_name: 'Level 3'
ip: '2021'
mac: 'All industries'
main.yml
---
- name: csv
hosts: localhost
gather_facts: no
tasks:
- name: var
include_vars: ./iterate_hosts.yml
- name: includeing role
with_sequence: 0-10
include_role:
name: csv_test
Роль Ansible (главный файл csv_test) csv_test/task/main.yml
---
- set_fact:
count123: '{{item}}'
- name: test
debug:
msg: "{{ hostlist[item]}}"
Ошибка:
"msg": "Задача включает параметр с неопределенной переменной. Ошибка: "объект списка" не имеет атрибута "0"\n\nОшибка, по-видимому, находится в "/csv/csv_test/tasks/main.yml"
Наблюдения:
{{ hostlist[count123] }}
должно быть {{ hostlist[0] }}"
для первой итерации и так далее.ok: [localhost] => {
"ansible_facts": {
"count123": "0"
},
"changed": false
}
Это решение работает, если значение похоже на "count123": 0
Как мы можем избежать кавычек и получить целое число, а не строку?
Ожидание: мне нужно перебрать ./iterate_hosts.yml, и для этого я использую with_sequence: 0-10
в моем файле main.yml.
Так:
для hostlist[count123]
(что должно быть count123=0
для первой итерации), он должен печатать форму содержимого ./iterate_hosts.yml
host: '2019'
inventory_name: 'Level 1'
ip: '2019'
mac: 'All industries'
для hostlist[count123]
(что должно быть count123=1
для второй итерации) он должен печатать
host: '2020'
inventory_name: 'Level 2'
ip: '2020'
mac: 'All industries'
и так далее
Для этого можно использовать фильтр int Jinja.
Таким образом, ваш файл csv_test/task/main.yml выглядит следующим образом:
- set_fact:
count123: "{{ item | int }}"
- debug:
msg: "{{ hostlist[item | int] }}"
Обратите внимание, что тот факт, что with_sequence
генерирует строки, упоминается в документации.
- Сгенерированные элементы являются строками. Используйте фильтры Jinja2 для преобразования элементов в предпочтительный тип, например.
{{ 1 + item|int }}
Source: https://docs.ansible.com/ansible/devel/collections/ansible/builtin/sequence_lookup.html#synopsis
Вот полная рабочая книга:
- hosts: localhost
gather_facts: no
tasks:
- debug:
msg: "{{ hostlist[item | int] }}"
with_sequence: 0-2
vars:
hostlist:
- host: '2019'
inventory_name: 'Level 1'
ip: '2019'
mac: 'All industries'
- host: '2020'
inventory_name: 'Level 2'
ip: '2020'
mac: 'All industries'
- host: '2021'
inventory_name: 'Level 3'
ip: '2021'
mac: 'All industries'
Это дает резюме:
PLAY [localhost] **************************************************************************************************
TASK [debug] ******************************************************************************************************
ok: [localhost] => (item=0) => {
"msg": {
"host": "2019",
"inventory_name": "Level 1",
"ip": "2019",
"mac": "All industries"
}
}
ok: [localhost] => (item=1) => {
"msg": {
"host": "2020",
"inventory_name": "Level 2",
"ip": "2020",
"mac": "All industries"
}
}
ok: [localhost] => (item=2) => {
"msg": {
"host": "2021",
"inventory_name": "Level 3",
"ip": "2021",
"mac": "All industries"
}
}
PLAY RECAP ********************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
внес изменения: - имя: тестовая отладка: msg: "{{hostipmacs[count123 | int]}}" я не знаю, почему итерация всегда принимает первый вывод списка ok: [localhost] => { "ansible_facts": { "count123": "0" }, "changed": false } ok: [localhost] => { "msg": { "host": "2019", "inventory_name": "Level 1", "ip": "99999", "mac": "Все отрасли" } }
Я бы сделал count123: "{{ item | int }}"
, но это действительно вопрос точки зрения...
ожидание для «count123»: «0» должно печатать первый набор значений из ./iterate_hosts.yml и аналогично для «count»: «1» он должен печатать второй набор значений из ./iterate_hosts.yml и т. д. на
@Vaibhav тбх, не совсем понятно, чего вы ожидаете, возможно, вам следует отредактировать это в своем вопросе. set_fact
предназначен только для отладки? debug
предназначен только для отладки?
Но в любом случае концепция остается прежней var_that_holds_the_string_representation_of_an_int | int
даст вам указанный int.
И если вы говорите нам, что всегда получаете первый элемент, это может быть причиной (из связанного документа Jinja): если преобразование не работает, оно вернет 0
@β.εηοιτ.βε спасибо за решение .. вы были правы ... это было плохо, я не заметил, что в фактическом yml значения повторяются, поэтому я получил повторяющееся значение .. .. Теперь это разобрался ...... Ура :) счастливого обучения
Очень близко, но ты был первым ;) Удаление моего ответа.