Intro
犹豫再三要不要写这么没有技术含量的博客,然后还是觉得为了工作闭环,小记一下。
使用的情景是从公网迁移资源到私网本地环境。调用接口放在了 Ansible Tower 中,需要填入关于公网资源的信息等,后台会下载公网资源,然后上传到私网环境的资源池 Artifactory。为了今后下载的话,私网环境毕竟是相对比较快的。
调用接口
# 需要修改以下:
# 1. artifactory_url: 私网资源池路径(请确保对该路径有写权限)
# 2. curl_url: 公网资源路径
# 3. target_file: 目标资源名称及临时保存的资源名称
# 4. target_path: 私网资源池子路径(请确保对该路径有写权限)
artifactory_url: 'https://xx.xx.com'
curl_url: >-
https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64
target_file: docker-compose-Linux-x86_64
target_path: more
vault_id: vault_id
实现代码
用户名/密码这两个值,我用 ansible-vault create vault.yml; ansible edit vault.yml
封装在 vault 里,提高了安全性,当然也就会有一些关于便捷性受损的考量。不过,这点还是要看实际的应用需求想做到哪一步。
# 入口
---
- name: curl public large files and transfer to artifactory
hosts: x.x.x.x
gather_facts: false
become: yes
become_method: sudo
become_user: root
roles:
- curl_transfer_artifactory
# roles svc: curl files on public to artifactory
---
- name: curl to localhost
get_url:
url: "{{ curl_url }}"
dest: /tmp/{{ target_file }}
mode: 0644
timeout: 86400
- name: upload to artifactory
shell: curl -u "{{ username }}:{{ password }}" -T /tmp/{{ target_file }} "{{ artifactory_url }}/{{ target_path }}/{{ target_file }}"
- name: delete tmp files
shell: rm -rf /tmp/{{ target_file }}
when: target_file is defined
补充
在使用过程中,因为 Ansible Tower 是搭载在 Docker 环境中的,所以有一些独特的地方可以小记一下。作为本脚本运行的机器节点若选择 localhost,就会被下载到 /var/lib/docker/ 的一个挂载目录下,这其实是会影响后续上传的,所以 hosts 最好写实际的 ip 地址。
同样,想要看实时的下载情况,用 ps -ef |grep curl
是看不到的,最好的解决方法就是看对公网的端口流量,这里用到了 iftop 这个工具。
进一步
其实还有一些我能想到的遗留问题,一个是执行下载的节点硬盘容量判断:如果已经资源大于硬盘容量,就提醒用户或者分配其他资源,df -h
;还有,资源缓冲池如果已经有了这个资源(通过 checksum 判断),那么就跳过下载,直接提示用户已经有了这个资源,不需要重复下载再上传。