如何让Ansible的get_url与unarchive命令实现幂等性?
让Ansible下载和解压任务实现幂等性的方法
嘿,作为Ansible新手,你关注幂等性这点非常棒——这正是配置管理工具的核心价值之一!咱们一步步来改造你的两个任务,完美满足你的需求:
1. 下载任务:避免重复下载已存在的文件
你的get_url任务其实已经自带基础的幂等性了!默认情况下,Ansible会检查目标路径的文件是否存在:
- 如果文件不存在,就正常下载;
- 如果文件已存在,它会尝试对比源文件的校验和(如果远程服务器能提供的话),只有当校验和不一致时才会重新下载。
如果你想更严格地实现「只要文件存在就绝不重新下载」(不管源文件有没有更新),可以显式添加force: no参数:
- name: Download WordPress tags: - wordpress - wordpress:install get_url: url: "http://wordpress.org/wordpress-{{ wordpress_version }}.tar.gz" dest: "{{ www_docroot }}/wordpress-{{ wordpress_version }}.tar.gz" # 可选:强制只要文件存在就跳过下载 force: no
2. 解压任务:避免重复解压到已存在的目标文件夹
unarchive模块默认不会自动判断目标文件夹是否存在,所以需要用creates参数来实现幂等性。这个参数的作用是:如果指定的路径(文件或目录)已经存在,就跳过当前任务。
对于WordPress来说,解压后会生成{{ www_docroot }}/wordpress目录,所以我们把这个路径作为creates的值:
- name: Extract archive tags: - wordpress - wordpress:install unarchive: src: "{{ www_docroot }}/wordpress-{{ wordpress_version }}.tar.gz" dest: "{{ www_docroot }}" remote_src: true creates: "{{ www_docroot }}/wordpress"
完整的幂等性任务代码
把上面的修改整合起来,最终的任务是这样的:
- name: Download WordPress tags: - wordpress - wordpress:install get_url: url: "http://wordpress.org/wordpress-{{ wordpress_version }}.tar.gz" dest: "{{ www_docroot }}/wordpress-{{ wordpress_version }}.tar.gz" # 可选:根据你的需求决定是否添加force参数 # force: no - name: Extract archive tags: - wordpress - wordpress:install unarchive: src: "{{ www_docroot }}/wordpress-{{ wordpress_version }}.tar.gz" dest: "{{ www_docroot }}" remote_src: true creates: "{{ www_docroot }}/wordpress"
额外优化:保证文件完整性(可选)
如果担心下载的归档文件可能损坏,你还可以给get_url添加checksum参数,指定官方的校验值。Ansible会先校验本地文件的哈希,只有当哈希不匹配时才会重新下载,比如:
get_url: url: "http://wordpress.org/wordpress-{{ wordpress_version }}.tar.gz" dest: "{{ www_docroot }}/wordpress-{{ wordpress_version }}.tar.gz" checksum: "sha256:http://wordpress.org/wordpress-{{ wordpress_version }}.tar.gz.sha256"
这样既保证了幂等性,又能确保文件没有被篡改或损坏。
内容的提问来源于stack exchange,提问作者user2490003
相关产品推荐
相关产品推荐

