从处理程序执行Ansible主机上的命令

我正在尝试在Ansible(v1.9.1)中实现以下场景:

  1. Ansible连接到远程主机并使用su来成为root
  2. Ansible主机获取将要重启的远程configuration文件。
  3. Ansible主机商店使用git add ...将刚刚获取的文件添加到包含目标目录的Git存储库中。
  4. Ansible主机使用git commit ... 提交刚刚提取的文件,并git commit ...适当的提交消息。

现在,从v1.9.0.1开始,(1)得到了完全支持,(2)对于获取模块非常简单 – 默认情况下它甚至将文件存储在主机特定的子目录下。

但是,我还没有弄清楚(3)和(4)。 理想情况下,我希望Ansible只是作为首先启动它的用户执行一个本地命令。 我可以创build一个包装shell脚本来做到这一点,但这似乎与Ansible的做事方式相悖。

互联网上的大多数post都build议使用local_action模块。 然而, local_action似乎完全是为了达到我的目的 – 它试图通过正确的权限升级来访问主机。 结果失败了:

致命的:[host00 – > 127.0.0.1] =>内部错误:该模块不支持通过su运行命令

这是我的处理程序当前的样子:

 - name: stage-archive-file become: false su: false local_action: command git -C {{ playbook_dir }} add storage/archive notify: commit-archive-file 

local_action似乎完全忽略了我不想使用su尝试,尽pipe我不确定这是否与这个特定的模块或su方法有关。

有一个简单的方法来执行一个命令从一个可靠的过程? 另外,是否有可能以某种方式获得local_action工作?


似乎有一个相关的Ansible问题可能会阻止local_action在这种情况下正常工作。 显然, local_actiondelegate_to保留了“父”任务的一些连接设置,即使这些连接设置对于委托主机来说是完全无效的。

    虽然我预计这个问题的根本原因将在未来的Ansible版本中得到解决,但我推出了自己的解决scheme。 基本上,我修改/黑客一个简单的连接插件Ansible,只是在主机上执行一个命令。 过程如下:

    • 在playbook目录下创build一个名为connection_plugins的子目录。

    • 将Ansible安装中的local.py连接插件(例如/usr/lib/python2.7/site-packages/ansible/runner/connection_plugins/local.py )复制到新创build的不同名称的子目录中,如execute.py

    • 编辑connection_plugins/execute.py并删除与特权升级方法相关的代码部分。

    • 使用参数ansible_connection=execute在清单文件中添加一个localhost条目。

    如果local_action确实需要使用特权升级方法来执行某些任务,则最后一步需要修改。 在这种情况下,可以不修改localhost (如果有)的条目,用execute连接types定义另一个别名,然后在任务定义中使用delegate_to:而不是local_action: