如何确保我的ansible模块仅在主服务器上运行?

时间:2016-01-29 19:18:40

标签: ansible ansible-2.x

短版

我想确保我的模块只在ansible主服务器上运行(所以local_actionconnection: local)。并且,如果可能的话,我希望我的模块知道ansible项目根目录的路径,而不强迫用户将其作为参数提供。

实际用例

我写的ansible模块由两个可执行文件组成:

  • python可执行文件 - 它使用AnsibleModule类来保证与ansible的稳定接口。
  • ruby​​可执行文件 - 它使用Hiera API。同样,部分原因在于稳定性,部分原因是因为我不得不在python中从头开始编写hiera。

唯一的问题是,为了运行ruby可执行文件,我不得不假设:

  • 正在主人身上运行,
  • 运行playbook的用户将ansible项目root作为他们的CWD。

我必须假设这些东西,因为,因为ansible不知道ruby可执行文件,所以该可执行文件只能在主服务器上使用。因此,如果它在从属计算机上运行,​​它几乎肯定会失败,因为它无法找到ruby文件。更糟糕的是,它可能是一个安全问题;如果在ansible slave上有文件上传文件,则恶意用户可以确保路径./library/<my_executable>.rb 包含可执行文件(例如,启动反向shell)。 / p>

我希望这可以附带安全默认设置,但我对ansible的做法并不熟悉,以确保发生这种情况。

这两个可执行文件都已完成(除了这部分,如上所述,它使用的是使用硬编码路径的肮脏黑客并希望它们在主服务器上)并且模块可以工作。它是可读的,可维护的,经过彻底的单元测试和记录,并且我没有根据有人认为他们认为更好的做事方式而对其进行重新架构。这并不是说我已经客观地想到了最好的方法,只是因为我找不到答案,只是告诉我要做一切可执行的事情&#34;很有帮助。因为我回答了一个问题,所以我没有兴趣询问。

2 个答案:

答案 0 :(得分:2)

模块应在任何主机上执行。 ansible做的第一件事是打包模块,然后在远程主机上调用它,并且没有办法阻止它。模块在执行时可用的数据非常有限,因为它仅限于模块用户在任务中明确传递给它的内容。除非您知道控制主机的名称,否则我认为没有简单的方法 - 使用模块进行操作。

即使这意味着重新构建一下:您的用例听起来像是宁愿创建一个动作插件。动作插件与您使用模块完全相同,但永远不会传输到远程主机,而是在控制主机上本地执行。

不幸的是,动作插件记录最少 - 意味着它们甚至没有被提及in the docs ...所以这里你可以看一些例子:https://github.com/ansible/ansible/tree/ce2b18174e2a767f34932073220f43cb889d54d4/lib/ansible/plugins/action

答案 1 :(得分:0)

查看 delegation 。 我之前只有delegate_to只能通过使用127.0.0.1或localhost在主控制主机上执行任务,而且运行良好。

local_action也在委托主题下简要引用。 根据文档的例子:

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum: name=acme-web-stack state=latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

和delegate_to的简写版本,即local_action:

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}