代码之家  ›  专栏  ›  技术社区  ›  rawat

Ansible自定义角色(带有自定义命令模块)

  •  0
  • rawat  · 技术社区  · 7 年前

    我试图实现一个自定义的网络命令模块,作为一个Ansible角色。此模块将在远程设备上运行命令。

    Ansible连接类型为 网络客户端

    使用下面的命令创建角色

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

    这给了我以下默认目录结构

      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
    

    此外,它还试图寻找 插件/cliconf/myos。py 在默认的Ansible位置下,而不是我的Ansible角色(test命令mod)。

    我希望它能看进去 角色/测试命令mod/cliconf_plugins/myos。py

    这是一个bug还是故意的?

    此外,如果

    • 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。具体如下

    [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
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Stopostit    7 年前

    我们有完全相同的问题,我们已经调查了一周。

    我们尝试了和你一样的事情,结果也一样。

    我们想出的解决方案是使用安装。yml,以便将terminal和cliconf添加到各自的系统安装目录中。

    ---
    - 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
    

    然后,您可以添加一个安装调用。主要是yml。yml,以便在您使用角色时执行副本:

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

    当做

    住手