asm/php-ansible

Ansible 的 PHP 封装。

v4.1.0 2023-02-28 11:00 UTC

README

Build PHP 8.0/8.1/8.2

这个库是 Ansible 配置工具的 OOP 封装。我打算使用这个库为 symfony2 框架创建一个包,并基于 php/symfony2 开发一个部署 GUI。当前实现已完全支持 ansible-playbookansible-galaxy 命令。

先决条件

您的操作系统应该是 Linux 的某个版本,并且必须已安装 Ansible。如果 Ansible 在 PATH 中,那就最简单了。库会自动尝试找到 ansible-playbook 和 ansible-galaxy,或者使用您提供的路径/可执行文件。

使用方法

首先实例化基础对象,该对象充当命令的工厂。只有第一个参数是必需的,它为库提供您的 Ansible 配置文件结构路径。

$ansible = new Ansible(
    '/path/to/ansible/deployment'
);

可选地,您可以指定您的 ansible-playbookansible-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!:-) xabbuhemielmolenaarsaveriosoupdiverlinaoripaveldanilin 以及许多其他人!

未来功能

实施的下一步是

  • 由于当前剧本的整体复杂性,改进类型处理和结构
  • 各个地方都有标量类型提示
  • 提供开发中的Docker支持
  • 为下一个主要版本专用于PHP 8.0
  • 将库封装成一个包 -> 可能
  • 提供命令行功能 -> 可能

许可证

php-ansible遵循MIT许可证。请参阅LICENSE获取完整的许可证文本。