每个目录而不是每个主机使用 Ansible

Using Ansible per directory instead of per host

我知道这听起来有点奇怪,但我想知道是否有一种方法可以按目录而不是按主机使用 Ansible。

我们当前的用例如下:同一个应用程序(此处为 WordPress)部署到同一主机上的多个文件夹中(可能是托管服务提供商中非常常见的场景)。

我们想以 'smart' 的方式管理所有实例的配置(因此有了使用 Ansible 的想法)。例如,应将相同的文件(插件)复制到实例的相同子文件夹中。

如果所有实例都托管在不同的主机上,这很容易实现,但我可以找到一种方法在同一主机上的不同文件夹中实现这一点。

这完全是愚蠢的吗?有没有更好的工具来做到这一点?任何见解将不胜感激。

您可以为您想要部署应用程序的所有文件夹定义一个列表变量,并使用 {{ item }} 占位符作为路径,例如,如果您想管理 wp-config.php 文件对于所有网站,

- name: Manage wp-config based on a template
  template:
    src: "wp-config.php.j2"
    dest: "/sites/{{ item }}/wp-config.php"
  with_items: 
    - www.xyz.com
    - foo.bar

您可以像这样为同一个物理主机(或 VM)定义不同的主机别名:

主机:

host_user1 ansible_host=host1.example.com app_root_path=/apps/user_john
host_user2 ansible_host=host1.example.com app_root_path=/apps/user_peter
host_user3 ansible_host=host2.example.com app_root_path=/apps/user_smith

这样你会有三个"hosts",但是host_user1host_user2是同一个物理主机host1.example.com,而host_user3实际上是host2.example.com。变量 app_root_path 特定于每个主机。所以你可以在你的剧本中做这样的事情:

- hosts: all
  tasks:
    - unarchive:
        src: myapp_dist.tgz
        dest: "{{ app_root_path }}/myapp/"

这会将 myapp_dist.tgz 提取到三个不同的目录。

但请注意,使用这种方法,您可能会遇到需要每个主机独占锁的模块(如 apt)。