Ansible 无法识别自定义模块

当您尝试制作自己的Ansible模块时,您会发现很多很棒的参考网站。

    • Ansibleのモジュール開発(基礎編)

 

    自作モジュール

然而,我按照所看学到的方法将自己编写的模块放置,但却遇到了无法识别的问题。

$ ansible -i develop 192.168.56.103 -m plain -u root
192.168.56.103 | FAILED! => {
    "msg": "The module plain was not found in configured module paths"
}

这是记录了到底应该怎么去做的疑问。

环境意味着我们所生活的自然和人造条件,包括空气、水、土壤和生物等。

$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

仓库结构

我打算按照最佳实践进行操作。

/home/ansi/repo/
    site.yml
    icanfly.yml
    develop/
        hosts
    group_vars/
        all.yml
        develop/
            main.yml
    library/
        plain.sh       # ココに置いた
    role/
        common/
            tasks/
                main.yml
        file/
        template/
---
- import_playbook: icanfly.yml
---
- hosts: test_grp
  roles:
    - common
#!/bin/bash
echo '{}'

我想起了 M ping。

第一次製作模塊時,我考慮到先單獨試試看,而不是直接將其組合到playbook中。就像常見的 -m ping 一樣。

$ cd /home/ansi/repo
$ ansible -i develop 192.168.56.103 -m ping -u root
192.168.56.103 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

当搜索“Ansible最佳实践库”时,通常会得到以下结果

Ansible模块可以通过以下途径进行搜索:
– 根据ansible.cfg文件中指定的library目录进行搜索。
– 根据环境变量ANSIBLE_LIBRARY指定的目录进行搜索。
– 根据命令行参数–module-path指定的目录进行搜索。
– 在当前执行目录下的名为library的目录中进行搜索。

这是以我想写的方式写的。
以下是直接采纳并执行的内容。

$ ansible -i develop 192.168.56.103 -m plain -u root
192.168.56.103 | FAILED! => {
    "msg": "The module plain was not found in configured module paths"
}

我听说了找不到模块的问题。

试着指定模块位置

我觉得 library/plain.sh本身就没有成为模块的体形,所以先尝试将先前记录的模块被识别的条件”在命令行中使用 –module-path 指定的目录”。

$ ansible -i develop 192.168.56.103 -m plain -u root --module-path library
192.168.56.103 | SUCCESS => {
    "changed": false
}

嗯,出了问题。这意味着我们果然是“把它放在library文件夹下,但它没有被识别”的情况对吧。

總結

我已经尝试了各种方法,但是解决问题的是以下网站。

Ansible 模块的创建基本步骤

其实,之前引用的这个网站后面还有一些内容延续着。

Ansible 的模块会从以下位置进行搜索:
– 由ansible.cfg中的library指定的目录
– 由环境变量ANSIBLE_LIBRARY指定的目录
– 由命令行参数–module-path指定的目录
– 执行playbook的目录下名为library的目录
对于项目特定的模块来说,最后一种方法是版本控制和执行的便利性考虑下,在执行playbook的目录下创建一个library目录会更方便。

在执行 Playbook 的目录下方,这样写着。
是的,我正在尝试的命令没有执行 Playbook。

$ mkdir -p roles/test/tasks
$ cat <<EOF >> roles/test/tasks/main.yml
- name: test plain
  plain:
EOF

$ cat <<EOF >> test.yml
---
- hosts: test_grp
  roles:
    - test
EOF

$ ansible-playbook -i develop -l test_grp -u root test.yml

PLAY [logget_tool] ***********************************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [192.168.56.103]

TASK [test : test plain] *****************************************************************************************
ok: [192.168.56.103]

PLAY RECAP *******************************************************************************************************
192.168.56.103             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

所以,完成了!

如果是playbook的话,它会帮我们搜索library文件夹下的内容。啊,真是舒心。

广告
将在 10 秒后关闭
bannerAds