精简版
我想确保我的模块只在 ansible master 上运行(例如 alocal_action
或 with connection: local
)。并且,如果可能的话,我希望我的模块知道 ansible 项目根目录的路径,而不强制用户提供它作为参数。
实际用例
我正在编写的 ansible 模块由两个可执行文件组成:
- python 可执行文件——它使用 AnsibleModule 类来保证 ansible 的稳定接口。
- ruby 可执行文件——它使用 Hiera API。同样,部分是为了稳定性,部分是因为否则我必须在 python 中从头开始编写 hiera。
唯一的问题是,为了运行 ruby 可执行文件,我不得不假设:
- 事情正在主人身上运行,并且
- 运行剧本的用户将 ansible 项目根作为他们的 CWD。
我必须假设这些事情,因为由于 ansible 不知道 ruby 可执行文件,因此该可执行文件仅在主服务器上可用。因此,如果它在从属机器上运行,它几乎肯定会因为找不到 ruby 文件而失败。更糟糕的是,这可能是一个安全问题;如果 ansible 从站上存在文件上传漏洞,恶意用户可以确保路径./library/<my_executable>.rb
确实包含可执行文件(例如,启动反向 shell)。
我希望它带有安全的默认值,但我对 ansible 在幕后所做的工作还不够熟悉,以确保发生这种情况。
两个可执行文件都已完成(除了这部分,如上所述,它使用了使用硬编码路径并希望它们在主服务器上的肮脏黑客)并且模块工作。它是可读的、可维护的、经过彻底的单元测试和记录的,而且我不会因为有人认为他们已经想到了更好的方法来重新构建它。这并不是说我客观地想到了最好的方法,只是我找不到一个简单地告诉我“在一个可执行文件中做所有事情”有用的答案。因为那是在回答一个我没有兴趣问的问题。