Множество фактов Ansible в шаблоне Jinja

#linux #ansible #jinja2

#linux #ansible #jinja2

Вопрос:

Я хочу извлечь все имена интерфейсов с хоста, а затем распечатать всю информацию об этом интерфейсе.

 --- # Fetches network interfaces with IPs
- hosts: hta
  gather_facts: yes
  become: yes
  tasks
- debug: msg=" {{ ansible_interfaces|length }}"
  register: num
- name: moving template over to server
  template: src=templates/network.j2 dest=/root/network_info.txt
  

И файл network.j2

 {% for int in ansible_interfaces %}
Interfaces: Interface-{{ int }}
Data: ansible_{{ int }}
{% endfor %}
  

До сих пор я не мог распечатать информацию, и Ansible принимает мой ввод ansible_{{ int }} как буквальный.

Ответ №1:

Приведенная ниже пьеса

 - command: "ifconfig {{ item }}"
  register: result
  loop: "{{ ansible_interfaces }}"
- template:
    src: template.j2
    dest: int.txt
  delegate_to: localhost
  

с помощью этого шаблона

 {% for int in result.results %}
Interfaces: Interface-{{ int.item }}
Data: {{ int.stdout }}
{% endfor %}
  

создает на локальном хостинге файл int.txt с данными интерфейсов.

Комментарии:

1. я получил следующую ошибку «AnsibleError: необработанное исключение возникло при запуске плагина поиска ‘pipe’. Ошибка была в <class’ansible.errors. Ошибка AnsibleError’>, исходное сообщение: lookup_plugin.pipe (ifconfig eth1) вернул 1»}

2. Извините, я не понимаю, что вы пытаетесь сказать.

3. Как и все поисковые запросы, канал будет выполняться на хосте контроллера ansible, поэтому он никогда не будет извлекать информацию с удаленного хоста

Ответ №2:

Чего я действительно не понимаю, так это того, что вы вызываете сервер, чтобы собрать информацию о его интерфейсах и отправить файл обратно на тот же сервер с информацией, которую вы могли бы собрать снова в любое время. Я действительно не вижу смысла, но мы начинаем.

Применение принципа KISS: вызов ifconfig , который вернет подробную информацию обо всех интерфейсах и сохранит результат в файле на удаленном хосте

playbook.yml

 - name: Simple interface info dump on hosts
  hosts: whatevergroup_you_need
  become: true
  gather_facts: false
  
  tasks:
    - name: dump ifconfig result to /root/network_interface.txt
      shell: ifconfig > /root/network_interfaces.txt
  

Примечания:

  • become: true требуется только потому, что вы хотите записать свой файл в корневом каталоге. Если вы запишете файл в другое место с надлежащими разрешениями, ifconfig он сам по себе может быть выполнен кем угодно
  • Поскольку нет необходимости собирать какую-либо другую информацию с хоста, gather_facts: false это ускорит выполнение этой простой задачи.
  • shell модуль является обязательным для перенаправления выходных данных в файл. Если вы беспокоитесь о безопасности, вы можете использовать command модуль вместо этого (без перенаправления файла), захватить выходные данные с помощью register и записать содержимое в файл в следующей задаче
  • Я предположил, что вы вызываете хост Linux, и он ifconfig выдает необходимую вам информацию. Если это не так, вам нужно переписать свой вопрос и быть более точным в отношении того, чего вы пытаетесь достичь.