我正在使用ansible并使用攻略。在本攻略中,我执行下载(从web url)和将文件解压到主机(使用unarchive模块),然后将一些文件从控制机器复制到主机(使用复制模块)。
发生的情况是,每次我使用unarchive模块时,虽然每个文件都是相同的,但ansible会覆盖主机中的文件。如果内容相同,我如何才能使其不被覆盖?
我的攻略:
---
- hosts: group1
sudo: yes
tasks:
- name: Download and Extract apache
unarchive:
src: http://mirrors.up.pt/pub/apache/tomcat/tomcat-9/v9.0.1/bin/apache-tomcat-9.0.1.tar.gz
dest: /opt/
remote_src: yes
- name: Copy file to host
copy: src=/etc/ansible/files/myfile.xml dest=/opt/apache-tomcat-9.0.1/conf/myfile.xml发布于 2017-11-22 22:21:13
添加一个引用未存档位置的内容的creates选项。
c.f.文档页面here (对照您正在使用的版本检查版本)。
例如:
- unarchive:
remote_src : yes
src : "{{ url }}"
dest : "{{ install_dir }}/"
creates : "{{ flagFile }}" 如果unarchive创建了一个包含名为bar的文件的/tmp/foo目录,那么flagFile可以是/tmp/foo/bar,如果已经存在,unarchive就不会再次运行。
发布于 2022-01-28 00:25:45
我已经根据情况采取了多种方式来处理这个问题。
选项1:
归档文件创建的其中一个文件具有特定的名称,例如foo-version_no
在这种情况下,我可以添加以下选项:
creates: 'foo=version_no'
如果这个文件存在,ansible将不会解压缩它。
警告:
如果解压的目录应该包含12个文件,并且其中至少有1个文件已被删除或更改,则解压模块将不会替换它们。
选项2:
如果文件名中没有版本号,请检查解压缩目录中的一个文件,并判断它是否为正确的文件。
可能是文件上的校验和;唯一参数的grep;或者执行带有'--version‘选项的命令。将结果注册到一个变量中:
register: correct_file
然后,unarchive命令可以具有when参数:
unarchive: . . . . . . when: (correct_file.stdout != My_Required_Version and correct_file is defined)
最后一部分是关于定义的,因为如果你确定提取的文件根本不存在,你会跳过检查版本,所以变量'correct_file‘将是未定义的。
警告:
请参阅选项1中的警告。
提取选项3:使用一个参数,或者使用一个不会覆盖文件的提取命令(如果文件没有更改)。
警告:仍然会有一些开销,因为提取命令需要评估每个文件,但不会生成新的文件。
选项4:
有另一种方法可以评估解压缩目录中文件的质量,并根据该结果设置一个变量。
一个简单的例子是对所有文件运行校验和,然后对该输出运行校验和,生成“校验和的校验和”。
例如:
curr_sum=$( cksum $( cksum /path/to/extracted/files/* ) ) if [ $curr_sum -eq $Correct_Value ] then echo "This is OK" exit 0 else echo "This is not ok" exit 1 fi
在ansible中,您将运行此命令并注册结果。然后将输出与预设值进行比较:
cmd: "script_name" register: cksum_answer failed_when: failed . . . unarchive: . . . . . . when: cksum_answer.rc == 1
https://stackoverflow.com/questions/47436886
复制相似问题