使用Ansible比较文件

时间:2014-10-13 11:46:16

标签: ansible ansible-playbook

我需要找到一种方法,可以比较给定elasticsearch数据主机组中的elasticsearch模板文件夹。这意味着如果目录是/usr/local/elasticsearch/config/templates/,我需要确保该ansible主机组中该目录中的所有文件都是相同的。

没有额外的模板文件或差异版本模板文件。我还没有弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:1)

尝试使用shell模块将ansible与rsync dry-run结合使用:

ansible -i production data_hosts -l '!~host1' -f 1 -m shell \
  -a 'rsync --checksum --delete --dry-run -r -v host1.example.com:/usr/local/elasticsearch/config/templates/ /usr/local/elasticsearch/config/templates'

<强>解释

  • 将[data_hosts]组中所有主机上的/ usr / local / elasticsearch / config / templates目录与host1进行比较
  • 使用-l限制参数-l '!~host1'
  • 排除host1.example.com
  • 使用-f 1一次只运行一次比较。可选,但在我的情况下有帮助,因为目录包含大量文件(&gt; 10K)
  • 使用--dry-run阻止rsync实际同步目录
  • 使用--delete列出目标目录中的无关文件
  • 使用--checksum基于校验和而非模态时间和大小来比较文件

备注

  • 您可以修改此单行以删除--dry-run以执行同步。请考虑在传输过程中添加-z以压缩文件数据,并在存档模式下添加-a
  • 生产清单文件如下所示:

    [data_hosts]
    host1.example.com
    host2.example.com
    host3.example.com
    host4.example.com
    

答案 1 :(得分:0)

我首先比较了模板文件夹下该给定组中所有主机中的文件数,然后获取文件列表及其各自的md5sum值,并使用include_vars将它们导出到当前的playbook。然后我将每个文件md5sum与使用include_vars和with_items导出的文件进行比较。