ansible—确保文件内容在不同服务器上是相同的

ansible—确保文件内容在不同服务器上是相同的,ansible,Ansible,使用Ansible 2.9.12 问题:当文件至少存在于一台主机上时,如何配置Ansible以确保文件内容在至少三台主机之间相等 假设有3个主机 主机1没有/file.txt 主机2有/file.txt,内容为hello 主机3有/file.txt,内容为hello 在播放之前,我不知道文件是否存在。因此,文件可能存在于主机1、主机2或主机3上。但该文件至少存在于一台主机上 如何确保每次Ansible运行时,主机上的文件都是相等的。因此,最终,主机1与主机2或主机3具有相同的文件和相同的内容 我

使用Ansible 2.9.12

问题:当文件至少存在于一台主机上时,如何配置Ansible以确保文件内容在至少三台主机之间相等

假设有3个主机

主机1没有
/file.txt

主机2有
/file.txt
,内容为
hello

主机3有
/file.txt
,内容为
hello

在播放之前,我不知道文件是否存在。因此,文件可能存在于主机1、主机2或主机3上。但该文件至少存在于一台主机上

如何确保每次Ansible运行时,主机上的文件都是相等的。因此,最终,主机1与主机2或主机3具有相同的文件和相同的内容

我希望这是动态设置的,而不是指定主机名或组名,例如:inventory\u hostname==host1时

我不希望检查主机2和主机3的内容是否相等


但是,我确实希望以幂等方式进行设置。

我相信get_url模块功能非常广泛,允许本地文件路径或来自web服务器的路径。试试看,让我知道

 - name: Download files in all host
   hosts: all 
   tasks:
    - name: Download file from a file path
      get_url:
        url: file:///tmp/file.txt
        dest: /tmp/
编辑的ans: (来自文档:对于同步模块,“本地主机”是同步任务发起的主机,“目标主机”是同步连接的主机)


我相信get_url模块是非常通用的-允许本地文件路径或来自web服务器的路径。试试看,让我知道

 - name: Download files in all host
   hosts: all 
   tasks:
    - name: Download file from a file path
      get_url:
        url: file:///tmp/file.txt
        dest: /tmp/
编辑的ans: (来自文档:对于同步模块,“本地主机”是同步任务发起的主机,“目标主机”是同步连接的主机)


我们可以通过从文件所在的主机获取文件来实现。这些文件将在控制计算机上可用。但是,如果源文件存在于多个节点上,那么就不会有单一的真相来源

考虑一个清单:

[我的主机]
旅社1
旅社2
旅社3
然后,下面的播放可以获取该文件,然后使用该文件复制到所有节点

#从远程主机获取文件(如果存在)
-主持人:我的主持人
任务:
-统计:
路径:/file.txt
注册:我的文件
-获取:
src:/file.txt
目的地:/tmp/
何时:my_file.stat.存在
-查找:
路径:
-/tmp
模式:file.txt
递归:是的
寄存器:本地文件
委托给:localhost
-副本:
src:{{local_file.files[0].path}
目的地:/tmp

如果多个主机有此文件,则它将位于
/tmp/{{ansible\u host}}
中。然后,由于我们没有一个真实的来源,我们最好的估计是使用第一个文件并应用于所有主机。

我们可以通过从文件所在的主机获取文件来实现。这些文件将在控制计算机上可用。但是,如果源文件存在于多个节点上,那么就不会有单一的真相来源

考虑一个清单:

[我的主机]
旅社1
旅社2
旅社3
然后,下面的播放可以获取该文件,然后使用该文件复制到所有节点

#从远程主机获取文件(如果存在)
-主持人:我的主持人
任务:
-统计:
路径:/file.txt
注册:我的文件
-获取:
src:/file.txt
目的地:/tmp/
何时:my_file.stat.存在
-查找:
路径:
-/tmp
模式:file.txt
递归:是的
寄存器:本地文件
委托给:localhost
-副本:
src:{{local_file.files[0].path}
目的地:/tmp

如果多个主机有此文件,则它将位于
/tmp/{{ansible\u host}}
中。那么,由于我们没有一个真实的来源,我们最好的估计是使用第一个文件并应用于所有主机。

我认为下面的剧本就可以做到这一点

shell>cat pb.yml
-主持人:全部
任务:
-名称:获取状态。
斯达:
路径:/file.txt
注册:状态
-区块:
-名称:创建字典状态。
设定事实:
状态:{{dict(键| zip(值))}”
变量:
键:“{{ansible\u play\u hosts}”
值:“{{ansible\u play\u hosts”|
映射('extract',hostvars,['status','stat','exists']))|
列表}”
-姓名:失败。没有文件存在。
失败:
msg:没有文件存在
当:status.values()|列表不是任何
-名称:将引用设置为存在文件的第一个主机。
设定事实:
参考:“{{状态|命令2项|
selectattr('值')|
映射(属性='key')|
第一}}”
-名称:获取文件。
获取:
src:/file.txt
目的地:/tmp
委托给:“{{reference}}”
跑一次:对
-名称:复制文件(如果不存在)
副本:
src:“/tmp/{{reference}}}/file.txt”
dest:/file.txt
时间:非状态[目录\主机名]
但是,这不会检查现有文件是否同步。我认为同步所有主机会更安全

-名称:同步文件
使同步:
src:“/tmp/{{reference}}}/file.txt”
dest:/file.txt
时间:非状态[目录\主机名]

问:“致命。在Ansible控制器上找不到或访问'/tmp/test-multi-01/file.txt'。但是,文件夹/tmp/test-multi-03中存在文件.txt。”

答:将任务委派给其他主机时,模块出现问题。当
任务[Fetch file.]
委托给
test-multi-01
时,该任务在本例中是本地主机
更改:[test-multi-03->127.0.0.1]
文件将从
test-multi-01
获取,但将存储在