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 判斷),那麼就跳過下載,直接提示用戶已經有了這個資源,不需要重複下載再上傳。