asm / php-ansible
Ansible 的 PHP 封装。
Requires
- php: ^8.0.0|^8.1.0|^8.2.0
- psr/log: ^1.1|^2.0|^3.0
- symfony/process: ^5.3|^6.0
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ^9.5|^10.0
This package is auto-updated.
Last update: 2024-09-14 10:31:24 UTC
README
这个库是 Ansible 配置工具的 OOP 封装。我打算使用这个库为 symfony2 框架创建一个包,并基于 php/symfony2 开发一个部署 GUI。当前实现已完全支持 ansible-playbook
和 ansible-galaxy
命令。
先决条件
您的操作系统应该是 Linux 的某个版本,并且必须已安装 Ansible。如果 Ansible 在 PATH 中,那就最简单了。库会自动尝试找到 ansible-playbook 和 ansible-galaxy,或者使用您提供的路径/可执行文件。
使用方法
首先实例化基础对象,该对象充当命令的工厂。只有第一个参数是必需的,它为库提供您的 Ansible 配置文件结构路径。
$ansible = new Ansible( '/path/to/ansible/deployment' );
可选地,您可以指定您的 ansible-playbook
和 ansible-galaxy
命令的路径,以防它们不在 PATH 中。
$ansible = new Ansible( '/path/to/ansible/deployment', '/optional/path/to/command/ansible-playbook', '/optional/path/to/command/ansible-galaxy' );
您还可以传递任何 PSR 合规的日志类以记录更多详细信息。这特别有用,可以记录实际的运行命令。
$ansible = new Ansible( '/path/to/ansible/deployment' ); // $logger is a PSR-compliant logging implementation (e.g. monolog) $ansible->setLogger($logger);
Playbooks
然后您可以使用该对象就像在之前的 Ansible 部署中一样。如果您没有通过 ->inventoryFile('filename')
指定库存文件,封装器会尝试根据您的剧本名称确定一个。
$ansible ->playbook() ->play('mydeployment.yml') // based on deployment root ->user('maschmann') ->extraVars(['project_release' => 20150514092022]) ->limit('test') ->execute();
这将生成以下 Ansible 命令
$ ansible-playbook mydeployment.yml -i mydeployment --user=maschmann --extra-vars="project-release=20150514092022" --limit=test
对于执行命令,您可以使用回调来获取命令的实时输出
$ansible ->playbook() ->play('mydeployment.yml') // based on deployment root ->user('maschmann') ->extraVars(['project_release' => 20150514092022]) ->limit('test') ->execute(function ($type, $buffer) { if (Process::ERR === $type) { echo 'ERR > '.$buffer; } else { echo 'OUT > '.$buffer; } });
如果没有提供回调,该方法将返回作为字符串的 Ansible-playbook 输出,因此您可以选择 echo
或直接将其重定向到日志/其他内容。
您还可以传递一个外部 YML/JSON 文件作为 extraVars,其中包含要传递给 Ansible 的复杂数据结构。
$ansible ->playbook() ->play('mydeployment.yml') // based on deployment root ->extraVars('/path/to/your/extra/vars/file.yml') ->execute();
您可以通过添加 json() 选项来获得 Json 输出,该选项启用 'ANSIBLE_STDOUT_CALLBACK=json' 环境变量,以便在 Ansible 中输出 Json。
$ansible ->playbook() ->json() ->play('mydeployment.yml') // based on deployment root ->extraVars('/path/to/your/extra/vars/file.yml') ->execute();
Galaxy
语法遵循 Ansible 的语法,但有一个小差异:在 PHP(数组上下文)中,list 是一个保留关键字,因此我不得不将其重命名为 "modulelist()"。
$ansible ->galaxy() ->init('my_role') ->initPath('/tmp/my_path') // or default ansible roles path ->execute();
将生成
$ ansible-galaxy init my_role --init-path=/tmp/my_path
您可以使用所有 Galaxy 命令
init()
info()
install()
help()
modulelist()
remove()
您可以将调用与它们的可能参数结合起来,尽管我没有逻辑来阻止例如 --force
应用到例如 info()。
可能的参数/选项
initPath()
offline()
server()
force()
roleFile()
rolesPath()
ignoreErrors()
noDeps()
进程超时
默认进程超时设置为 300 秒。如果您需要更多时间来执行您的进程:调整超时 :-)
$ansible ->galaxy() ->setTimeout(600) …
感谢您的贡献!
感谢您的审查、错误报告、建议和 PR!:-) xabbuh、emielmolenaar、saverio、soupdiver、linaori、paveldanilin 以及许多其他人!
未来功能
实施的下一步是
- 由于当前剧本的整体复杂性,改进类型处理和结构
- 各个地方都有标量类型提示
- 提供开发中的Docker支持
- 为下一个主要版本专用于PHP 8.0
- 将库封装成一个包 -> 可能
- 提供命令行功能 -> 可能
许可证
php-ansible遵循MIT许可证。请参阅LICENSE获取完整的许可证文本。