Как получить доступный вывод без двойных кавычек

Файл 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] }}" для первой итерации и так далее.
  • но Ansible принимает 0 как строку «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'
    
  • и так далее

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого можно использовать фильтр 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   

Очень близко, но ты был первым ;) Удаление моего ответа.

Zeitounator 16.12.2020 19:04

внес изменения: - имя: тестовая отладка: msg: "{{hostipmacs[count123 | int]}}" я не знаю, почему итерация всегда принимает первый вывод списка ok: [localhost] => { "ansible_facts": { "count123": "0" }, "changed": false } ok: [localhost] => { "msg": { "host": "2019", "inventory_name": "Level 1", "ip": "99999", "mac": "Все отрасли" } }

Vaibhav 16.12.2020 19:10

Я бы сделал count123: "{{ item | int }}", но это действительно вопрос точки зрения...

Zeitounator 16.12.2020 19:13

ожидание для «count123»: «0» должно печатать первый набор значений из ./iterate_hosts.yml и аналогично для «count»: «1» он должен печатать второй набор значений из ./iterate_hosts.yml и т. д. на

Vaibhav 16.12.2020 19:19

@Vaibhav тбх, не совсем понятно, чего вы ожидаете, возможно, вам следует отредактировать это в своем вопросе. set_fact предназначен только для отладки? debug предназначен только для отладки?

β.εηοιτ.βε 16.12.2020 19:26

Но в любом случае концепция остается прежней var_that_holds_the_string_representation_of_an_int | int даст вам указанный int.

β.εηοιτ.βε 16.12.2020 19:27

И если вы говорите нам, что всегда получаете первый элемент, это может быть причиной (из связанного документа Jinja): если преобразование не работает, оно вернет 0

β.εηοιτ.βε 16.12.2020 19:29

@β.εηοιτ.βε спасибо за решение .. вы были правы ... это было плохо, я не заметил, что в фактическом yml значения повторяются, поэтому я получил повторяющееся значение .. .. Теперь это разобрался ...... Ура :) счастливого обучения

Vaibhav 16.12.2020 19:50

Другие вопросы по теме