1

精简版

我想确保我的模块只在 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 在幕后所做的工作还不够熟悉,以确保发生这种情况。

两个可执行文件都已完成(除了这部分,如上所述,它使用了使用硬编码路径并希望它们在主服务器上的肮脏黑客)并且模块工作。它是可读的、可维护的、经过彻底的单元测试和记录的,而且我不会因为有人认为他们已经想到了更好的方法来重新构建它。这并不是说我客观地想到了最好的方法,只是我找不到一个简单地告诉我“在一个可执行文件中做所有事情”有用的答案。因为那是在回答一个我没有兴趣问的问题。

4

2 回答 2

2

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

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

不幸的是,动作插件是记录最少的 - 意味着它们甚至没有在文档中提到......所以在这里你可以看看一些例子:https ://github.com/ansible/ansible/tree/ce2b18174e2a767f34932073220f43cb889d54d4/lib/ ansible/插件/动作

于 2016-01-30T05:46:24.173 回答
0

看看代表团。我之前有 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 }}
于 2016-10-04T13:10:06.157 回答