#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
выдает необходимую вам информацию. Если это не так, вам нужно переписать свой вопрос и быть более точным в отношении того, чего вы пытаетесь достичь.