可以将Ansible unarchive写入静态文件夹修改时间吗?

hal*_*fer 12 wordpress ansible

我正在使用Ansible编写WordPress安装的构建过程.它目前没有应用程序级构建系统,我选择了Ansible,以便它可以与服务器构建脚本完全集成,因此只需按一下按钮就可以启动工作服务器.

我的大部分WordPress插件都安装了该unarchive功能,指向官方wordpress.org安装服务器上的版本化插件.我遇到了其中一个问题,即它总是被标记为"已更改",即使文件完全相同.

在检查了ls -Rl之前和之后的状态时,我注意到这个插件(WordPress HTTPS)是唯一一个使用内部子目录的插件,并且在每次解压缩时,文件夹的修改时间都会受到冲击.

这可能是有用的知道,这是一个项目构建脚本,用connectionlocal.因此我猜这意味着没有使用SSH.

这是我的剧本片段:

- name: Install the W3 Total Cache plugin
  unarchive: >
    src=https://downloads.wordpress.org/plugin/w3-total-cache.0.9.4.1.zip
    dest=wp-content/plugins
    copy=no

- name: Install the WP DB Manager plugin
  unarchive: >
    src=https://downloads.wordpress.org/plugin/wp-dbmanager.2.78.1.zip
    dest=wp-content/plugins
    copy=no

# @todo Since this has internal sub-folders, need to work out
# how to preserve timestamps of the original folders rather than
# re-writing them, which forces Ansible to record a change of
# server state.
- name: Install the WordPress HTTPS plugin
  unarchive: >
    src=https://downloads.wordpress.org/plugin/wordpress-https.3.3.6.zip
    dest=wp-content/plugins
    copy=no
Run Code Online (Sandbox Code Playgroud)

修复此问题的一种方法是使用ls -R前后使用选项来包含文件大小但不包括时间戳,然后使用md5sum该输出.如果校验和发生变化,我可以将其标记为已更改.它可以工作,但它不是很优雅(我想为所有插件做到这一点,为了一致性).

如果插件文件已经存在,另一种方法是放弃该任务,但是当我将插件版本号压缩到最新副本时会导致问题.

因此,理想情况下,我正在寻找一个转换来表示unarchive我想要从zip文件中修改文件夹,而不是从playbook运行时.可能吗?


更新:评论者询问文件内容是否可能以任何方式更改.为了确定它们是否有,我编写了这个脚本,它为(1)所有文件内容和(2)所有文件/目录时间戳创建校验和:

#!/bin/bash

# Save pwd and then change dir to root location
STARTDIR=`pwd`
cd `dirname $0`/../..

# Clear collation file
echo > /tmp/wp-checksum

# List all files recursively
find wp-content/plugins/wordpress-https/ -type f | while read file
do
    #echo $file
    cat $file >> /tmp/wp-checksum
done

# Get checksum of file contents
sha1sum /tmp/wp-checksum

# Get checksum of file sizes
ls -Rl wp-content/plugins/wordpress-https/ | sha1sum

# Go back to original dir
cd $STARTDIR
Run Code Online (Sandbox Code Playgroud)

我把它作为我的playbook的一部分运行(使用标签隔离运行)并收到:

PLAY [Set this playbook to run locally] ****************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [jonblog : Run checksum command] ******************************************
changed: [localhost]

TASK [jonblog : debug] *********************************************************
ok: [localhost] => {
    "checksum_before.stdout_lines": [
        "374fadc4df1578f78fd60b1be6758477c2c533fa  /tmp/wp-checksum", 
        "10d66f7bdbbdd3af531d1b11a3db3059a5868838  -"
    ]
}

TASK [jonblog : Install the WordPress HTTPS plugin] ***************
changed: [localhost]

TASK [jonblog : Run checksum command] ******************************************
changed: [localhost]

TASK [jonblog : debug] *********************************************************
ok: [localhost] => {
    "checksum_after.stdout_lines": [
        "374fadc4df1578f78fd60b1be6758477c2c533fa  /tmp/wp-checksum", 
        "719c9da94b525e723b1abe188ee9f5bbaf121f3f  -"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=6    changed=3    unreachable=0    failed=0   
Run Code Online (Sandbox Code Playgroud)

调试行反映了文件内容的校验和散列(这是相同的),然后ls -Rl是文件结构的校验和散列(这已经改变).这符合我之前的手册发现,目录校验和正在发生变化.

那么,接下来我该怎么做才能找出为什么文件夹修改时间错误地将此操作标记为已更改?

Fra*_*eni 5

您可能希望使用模块的creates选项,而不是每次都覆盖所有文件并找到保持相同修改日期时间的方法unarchive.

您可能已经知道,这告诉Ansible将根据任务创建特定的文件/文件夹.因此,如果该文件/文件夹已存在,则下次将不再运行该任务.

请参阅http://docs.ansible.com/ansible/unarchive_module.html#options


hal*_*fer 1

我的解决方案是修改校验和脚本并使其成为 Ansible 进程的永久功能。当 Ansible 应该为我做这件事时,我自己做校验和感觉有点麻烦,但它确实有效。

非常欢迎新的答案来解释我做错了什么,或者新版本的 Ansible 解决了问题。

如果我有时间,我会向 Ansible 团队提出这个可能的错误。然而,我有时确实想知道在繁忙的跟踪器上提出错误时的努力/回报比 - 我已经有一个项目未完成,它已经等待了一段时间,我也选择解决这个问题。

更新(18个月后)

这个 Ansible 构建系统从未投入使用。感觉就像我总是在围绕着一些事情工作。最近,当我决定需要将我的博客移至另一台服务器时,我最终对它进行了 Docker 化。这花了几周时间(因为在真正的 WordPress 安装中需要考虑的事情多得惊人),但总的来说,我发现这个过程比使用编排工具要好得多。