Ansible 如何使用puppet部署存档

Ansible 如何使用puppet部署存档,ansible,puppet,idempotent,Ansible,Puppet,Idempotent,我一直在使用ansible部署在jenkins中创建的工件。这出戏是这样的: scp_tarball_command = '/usr/bin/scp ...'; stop_python = '/usr/sbin/systemd stop whatever'; delete_code_dir = '/bin/rm -rf /home/arl/code'; untar_tarball = '/usr/bin/tar -xzf ...'; start_python = '/usr/sbin/syste

我一直在使用ansible部署在jenkins中创建的工件。这出戏是这样的:

scp_tarball_command = '/usr/bin/scp ...';
stop_python = '/usr/sbin/systemd stop whatever';
delete_code_dir = '/bin/rm -rf /home/arl/code';
untar_tarball = '/usr/bin/tar -xzf ...';
start_python = '/usr/sbin/systemd start whatever';

exec { $scp_tarball_command: creates => 'whatever'} ->
exec { $stop_python: refreshonly => true} ->
exec { $delete_code_dir: refreshonly => true} ->
exec { $untar_tarball: refreshonly => true} ->
exec { $start_python: refreshonly => true}
  • 将tar.gz归档文件传输到远程主机(归档文件包含python代码)
  • 停止python代码(它已被设置为systemd服务,符号链接到/home/arl/code中的脚本)
  • 删除/home/arl/code文件夹(递归)
  • 将tar.gz文件解压缩到/home/arl中
  • 启动代码的systemd脚本
  • 在puppet中,您可以使用服务提供程序管理服务。但由于您希望管理“状态”,因此不能将资源python_服务声明为“已停止”,然后在稍后的清单中声明为“已启动”,因为这将导致重复的声明错误。在ansible中,这是必需的,很容易实现


    有没有办法在puppet中实现它?

    对于您正在做的事情,您需要使用一系列
    Exec
    资源类型,并使用
    ->
    资源排序操作符。因此,您的puppet清单如下所示:

    scp_tarball_command = '/usr/bin/scp ...';
    stop_python = '/usr/sbin/systemd stop whatever';
    delete_code_dir = '/bin/rm -rf /home/arl/code';
    untar_tarball = '/usr/bin/tar -xzf ...';
    start_python = '/usr/sbin/systemd start whatever';
    
    exec { $scp_tarball_command: creates => 'whatever'} ->
    exec { $stop_python: refreshonly => true} ->
    exec { $delete_code_dir: refreshonly => true} ->
    exec { $untar_tarball: refreshonly => true} ->
    exec { $start_python: refreshonly => true}
    
    您需要在此处查看有关资源排序的详细信息:


    另外,我建议将代码放在类中,并用类参数替换硬编码的内容。

    嘿,我熟悉关系和顺序,也熟悉exec。在我看来,这样工作非常“不简单”。你能告诉我这是一种最佳做法还是一种可行的解决方案吗?这有点不简单puppetty,但是如果您将代码打包在RPM中,您可以更好地遵循
    包>>文件>>服务
    的傀儡模式。如果您将python代码打包到python包中,您可能可以在
    资源声明中使用
    pip
    作为
    提供者。pip思想对于pyt来说是一个好主意亲爱的。我的主要挑战是处理代码目录中的a文件可能被正在运行的进程锁定的情况。同样,从命令式方法来看,这相当容易处理。*停止->*覆盖代码->*启动。例如,如果您使用puppet管理nginx,并想升级它,puppet可能需要在服务启动之前停止服务确定代码目录的日期,然后重新启动。我将看看其他一些模块是如何实现这一点的。感谢您的建议。您想要: