问题描述
当运行 Ansible 脚本时,Ansible DSL 是如何转换为 Python(Linux)或 Powershell(Windows)的?我猜这是在 Ansible 节点上进行的,也就是执行 Ansible 命令的地方?
注意:我不是在问如何使用 Ansible 本身,或者从工具的角度来看它是如何工作的 – 我已经使用它多年了,所以我知道它是如何工作的。
谢谢!
解决方案
请注意以下操作注意版本差异及修改前做好备份。
Ansible DSL 到 Python 或 Powershell 的转换发生在 Ansible 任务执行器中,它会获取有关模块的信息,并将可执行代码推送到目标主机。
根据官方文档的说明:
Ansible 通过连接到节点并向其推送称为“Ansible 模块”的脚本来工作。
所以回答你的问题:
我猜这是在 Ansible 节点上进行的,也就是执行 Ansible 命令的地方?
是的,这是在控制节点上(执行 ansible
命令的节点)进行的。
根据控制节点的配置,它知道在哪里查找模块。这是通过 ANSIBLE_LIBRARY
环境变量或配置文件中的相关部分来设置的。
Ansible 任务执行器类的 _execute()
方法是查看这个过程发生的地方。
从我从执行器类中了解到的细节来看,Ansible 的执行过程大致如下:
- 创建一个任务队列管理器,其中包含任务列表(处理循环等)。
- 对于每个任务,根据模块类型创建一个任务执行器脚本,将该任务的所有相关上下文(模块变量、连接变量、魔术变量)引入其中。
- 创建与远程目标的连接,参见
connection.py
库。 - 将可执行文件的 pickle 写入远程目标(参见
write_to_file_descriptor()
)。
连接的一部分是确定远程解释器(Python/Powershell 等),任务执行器负责确保模块的执行环境中的远程解释器实际上存在(如果不存在,则会引发错误)。
感谢用户的回答,希望对你有帮助!
正文完