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文件夹下的内容。啊,真是舒心。