我正在使用Ansible为WordPress安装编写构建过程。它目前没有应用程序级的构建系统,我选择了Ansible,以便它可以与服务器构建脚本完美地集成在一起,因此我只需按一下按钮就可以启动工作的服务器。
我的大多数WordPress插件都安装了该unarchive
功能,指向官方wordpress.org安装服务器上的版本化插件。我仅遇到其中一个问题,即使文件完全相同,也始终将其标记为“已更改”。
在检查ls -Rl
之前和之后的状态之后,我注意到该插件(WordPress HTTPS)是唯一使用内部子目录的插件,并且在每次解压缩时,文件夹的修改时间都会增加。
知道这是一个项目构建脚本,带有的connection
,可能会很有用local
。因此,我想这意味着未使用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
解决此问题的一种简便方法是在使用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
我将其作为我的剧本的一部分来运行(使用标签单独运行),并收到了以下信息:
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
调试行反映文件内容的校验和哈希(这是相同的),然后ls -Rl
反映文件结构的校验和哈希(这已更改)。这与我先前的手动发现目录校验和正在更改的情况是一致的。
因此,接下来我该怎么做才能找出为什么文件夹修改时间未正确地将此操作标记为已更改的原因?
我的解决方案是修改校验和脚本,并使该脚本成为Ansible进程的永久功能。当Ansible应该替我做自己的校验和时,感觉有点不明智。
最受欢迎的新答案是解释我做错了事,或者新版本的Ansible解决了该问题。
如果有时间,我会向Ansible团队提出这个可能的错误。但是,有时我会怀疑在忙碌的跟踪器上提高bug时的努力/回报率-我已经有一项出色的项目,它已经等待了一段时间,并且我也选择解决这一问题。
这个Ansible构建系统从未使其投入使用。感觉就像我一直在努力工作。最近,当我决定需要将博客移至另一台服务器时,我最终对其进行了Docker化。这花了几周的时间(因为在真正的WordPress安装中要考虑的事情很多),但总的来说,我发现此过程比使用编排工具要好得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句