Ansible Custom Role (с настраиваемым командным модулем) - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь реализовать пользовательский сетевой командный модуль в качестве роли Ansible.Этот модуль будет запускать команды на удаленных устройствах.

Возможный тип подключения: network_cli

Создан роль с помощью приведенной ниже команды

ansible-galaxy init --type=network test-command-mod

, которая выдалаme ниже структуры каталогов по умолчанию

  roles
  └── test-command-mod
    ├── cliconf_plugins
    │   ├── myos.py           (my file)
    ├── defaults
    │   └── main.yml          
    ├── files
    ├── library
    │   ├── __init__.py
    │   └── myos_command.py   (my file - the command module)
    ├── meta
    │   └── main.yml
    ├── module_utils
    │   └── myos.py           (my file)
    ├── README.md
    ├── tasks
    │   ├── execute-commands.yml ( a test task to run commands )
    │   └── main.yml
    ├── templates
    ├── terminal_plugins
    │   ├── myos.py           (my file - emulating the myos terminal)
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

Ниже, как это используется в пьесе Ansible

  - hosts: my_os_cli
    gather_facts: False
    roles:
      - role: test-command-mod
    tasks:
    - name: run some commands on the device
      myos_command:
        commands:
          - command: 'show version'
          - command: 'show ntp status'
      vars:
        ansible_connection: network_cli
        ansible_network_os: myos

При использовании из роли происходит сбой с сообщением ниже

  The full traceback is:
  Traceback (most recent call last):
  File "/ansible/bin/ansible-connection", line 102, in start
    self.connection._connect()
  File "/ansible/lib/ansible/plugins/connection/network_cli.py", line 338, in _connect
    raise AnsibleConnectionFailure('network os %s is not supported' % self._network_os)
  AnsibleConnectionFailure: network os myos is not supported

При запуске Ansible в режиме отладки, см. Ниже в журнале

unable to load cliconf for network_os myos

Более того, он пытается найти plugins / cliconf / myos.py по умолчанию в Ansible location вместомоя роль Ansible (test-command-mod).

Я ожидаю, что она будет выглядеть в role / test-command-mod / cliconf_plugins / myos.py

Это ошибка или дизайн?

Кроме того, роль работает, если

  • ansible.cfg обновлен с

    cliconf_plugins     = ./roles/test-command-mod/cliconf_plugins
    terminal_plugins   =  ./roles/test-command-mod/terminal_plugins
    
  • ИЛИ задайте указанные ниже переменные среды

    export ANSIBLE_TERMINAL_PLUGINS=./roles/test-command-mod/terminal_plugins
    export ANSIBLE_CLICONF_PLUGINS=./roles/test-command-mod/cliconf_plugins
    
  • ИЛИ, если копировать файлы ( мой файл );в соответствующие каталоги в установке ANSIBLE.

Мысли, пожалуйста?

РЕДАКТИРОВАТЬ: ansible.cfg следующим образом

[defaults]
# after suggestion
#cliconf_plugins     = cliconf_plugins:./roles/test-command-mod/cliconf_plugins
#terminal_plugins   =  terminal_plugins:../roles/test-command-mod/terminal_plugins

# before suggestion
cliconf_plugins     = ./roles/test-command-mod/cliconf_plugins
terminal_plugins   =  ./roles/test-command-mod/terminal_plugins

[paramiko_connection]
look_for_keys = False

1 Ответ

0 голосов
/ 05 марта 2019

У нас точно такая же проблема, и мы изучали ее в течение недели.

Мы пробовали то же самое, что и вы, с теми же результатами.

Решение, которое мы придумали,использовать install.yml в каталоге задач, чтобы добавить терминал и clickonf в соответствующие каталоги установки системы.

---
- block: 
    - name: Create terminal target directory
      file: 
        path: /usr/share/ansible/plugins/terminal/ 
        state: directory 
        mode: 0755
      connection: local

    - name: install terminal plugin
      copy: 
        src: terminal_plugins/myos.py
        dest: /usr/share/ansible/plugins/terminal/myos.py
      connection: local

    - name: Create cliconf target directory
      file: 
        path: /usr/share/ansible/plugins/cliconf/ 
        state: directory 
        mode: 0755
      connection: local

    - name: install cliconf plugin
      copy: 
        src: cliconf_plugins/myos.py
        dest: /usr/share/ansible/plugins/cliconf/myos.py
      connection: local

  run_once: true

Затем вы можете добавить вызов install.yml в main.yml, чтобыон выполняет копию при использовании роли:

---
- name: install/update driver
  include: install.yml

С уважением,

Stopostit

...