有脚本经验的开发者在使用Ansible的时候很有可能会滥用shell、raw等方式,基本上就是以另外一种形式来用Ansible,还有一种基本上就是完全放弃脚本的方式,使用Ansible中符合幂等性的模块来进行功能的实现。但是有时利用一些常见的脚本基础或者基本命令的参数能够有效地简化功能的实现,同时使得代码更为容易理解一些。这篇文章以tar命令的strip-components参数的使用为例进行示例说明。
tar命令的strip-components
关于这个参数的使用,可以参看如下内容:
- https://liumiaocn.blog.csdn.net/article/details/104125958
Ansible的实现
在使用这个参数之前,实现上述链接的基本功能,Ansible的脚本可能会使用如下比较纠结的实现
- name: download binary :docker
get_url:
url: '{{ var_download_url_docker }}'
dest: '{{ var_download_file_docker }}'
mode: '{{ var_download_save_mode }}'
- name: extract binary files of docker
unarchive:
copy: no
src: "{{ var_download_file_docker }}"
dest: "{{ var_download_save_dir_docker }}"
# change docker directory name because of docker file in directory
- name: copy docker/dockertmp/ from docker/docker/
copy:
src: "{{ var_download_tmp_dir_docker }}/"
dest: "{{ var_download_tmp_dir_docker }}tmp/"
# delete docker/docker directory
- name : delete docker/docker directory for moving action
file:
path: "{{ var_download_tmp_dir_docker }}/"
state: absent
- name: create output docker binary dir
synchronize:
src: "{{ var_download_tmp_dir_docker }}tmp/"
dest: "{{ var_download_save_dir_docker }}"
看完之后会觉得确实非常纠结,自己都不想再看第二遍,使用shell的方式不是不符合Ansible的设计思路嚒,这么多的模块也没有一个一个看哪个的哪个选项能够实现这个功能,唯一的一个特点就是没有使用shell这样不符合幂等性的模块。
而如果不用这么纠结,直接使用shell模块,结合tar文件的strip-compoent选项如下代码即可完成
- name: download binary :docker
get_url:
url: '{{ var_download_url_docker }}'
dest: '{{ var_download_file_docker }}'
mode: '{{ var_download_save_mode }}'
- name: extract binary files of docker
shell: "tar zxvf {{ var_download_file_docker }} \
-C {{ var_download_save_dir_docker }} \
--strip-component=1"
理解起来也简单的多,一个task下载,另外一个task解压。所以有时活用一些基本命令,也可以使得Ansible的脚本更加容易维护和理解。