diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ef1a2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/node_modules/ +.svn/ +.git/ +.vscode/ +.idea/ +.history/ +venv diff --git a/syncimages/__pycache__/app.cpython-38.pyc b/syncimages/__pycache__/app.cpython-38.pyc new file mode 100644 index 0000000..e47cba0 Binary files /dev/null and b/syncimages/__pycache__/app.cpython-38.pyc differ diff --git a/syncimages/__pycache__/harbor.cpython-38.pyc b/syncimages/__pycache__/harbor.cpython-38.pyc new file mode 100644 index 0000000..46d6465 Binary files /dev/null and b/syncimages/__pycache__/harbor.cpython-38.pyc differ diff --git a/syncimages/__pycache__/k8s.cpython-38.pyc b/syncimages/__pycache__/k8s.cpython-38.pyc new file mode 100644 index 0000000..83b91b3 Binary files /dev/null and b/syncimages/__pycache__/k8s.cpython-38.pyc differ diff --git a/syncimages/app.py b/syncimages/app.py new file mode 100644 index 0000000..38332fc --- /dev/null +++ b/syncimages/app.py @@ -0,0 +1,44 @@ +import k8s +import harbor +import os +import argparse + +argparser = argparse.ArgumentParser() +argparser.description = '输入一个参数,--is_first ' +argparser.add_argument('-f', '--is_first', dest='is_first', default=False, help='是否是第一次执行') + +ns_list = ['anxinyun'] + + +def first_get_all(): + for ns in ns_list: + image_list = k8s.list_deployment(ns) + out_file(image_list) + + +def out_file(image_list): + image_url_list = list( + map(lambda i: "repository.anxinyun.cn/{}/{}:{}".format(i['project'], i['name'], i['tag']), image_list)) + if os.path.exists('images.txt'): + os.remove("images.txt") + with open("images.txt", "a") as file: + file.writelines(s + '\n' for s in image_url_list) + + +def get_latest_images(): + pre_image_list = [] + for ns in ns_list: + image_list = k8s.list_deployment(ns) + for image in image_list: + tag = harbor.get_image_latest_tag(image['project'], image['name']) + if tag != image['tag']: + pre_image_list.append(image) + out_file(pre_image_list) + + +if __name__ == '__main__': + args = argparser.parse_args() + if args.is_first: + first_get_all() + else: + get_latest_images() diff --git a/syncimages/config b/syncimages/config new file mode 100644 index 0000000..acbaca8 --- /dev/null +++ b/syncimages/config @@ -0,0 +1,19 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1USXdOVEUwTlRreE9Wb1hEVE14TVRJd016RTBOVGt4T1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTzE1CkdkbzNhSEc5d3J0NklVSnhzaEUzV2t6dU5WeDh6Vmtjd1I1TklvcStFREM5MEtXSGt4eDZhVjU1bFVpKzFUM1UKMXlXaXMzT1RYem5JWmlodjJkSDRuMGJKbUgzcXlHbkRzWW55aWlOb1pRVDVLN0JCTzd2N25zR1ZySDJFTWNMYQorKzNkWDVpN0Z5Ny9xam4rTWpNWDRDMHhoRWFTaE9ZVWsrNEZrR01DRTNsbjB3bGQwYzFJT0d6TEVITmIyTWxJCkhncTcvRVFJZnErb05qQnBNWkdRd2NnNTNrK3VkRElzZ3JzTFR1aUpHMSsrMzByWHFtUXR2RmlmQVpSL3dubVQKaUNPTEJqVW1OdlFERlhiaFZmOU5XcW5aa2lHbXRhWnRhTTBncFRONmtOcXhXOUpvbUtlV0VHU3dlYUVVbUJsMgpJbVVraDY5QjY0OEdENnU3cng4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZGQitUUTFJbm1KcVlVbng5UndsY3M1QVJVbXdNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQTlTVm91RUxwMDkvUk9HK1BseQpKSWxKMjdSWmx0emVrZ0QreS9Dc0krcW1GN3NLMnhIcnNveTBJb0phM2JoMTRqSVVLTHBsbTQrVGRUVEhOdlhMCnhxMWIvaFRFbWVOalhhUXRzdEphNzRNbitjRVlVNE1OZnJZblh0SUR4bkx0R2lZQ2NHSFEzVSsrMGNHYkJkTisKYUtBY0NWSnZGR0NHL3NwdXVkY3BQYUZUZFlBclQ2b2RGenQ4U3NOdU5pb2pzSkpvd0tVcVo2dXVwRkFYMmhLQgpla3UxbXpQa2ErazhnUmNEdlVqVExPU0g3RVhiYU4wR0IzUHU2dVdnREJvbkF5TU12aHJHazFFNlBOS1lKZGhzCk5YcDFINFVvOXoxbytwRE1pbldGY2lueXUyZUFTWFYvZ0dmSytUMHBkU29wSW9tRlBxS1ZZcXExVENnMjJuWmoKNkprPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + server: https://10.8.30.157:6443 + name: kubernetes +contexts: +- context: + cluster: kubernetes + user: kubernetes-admin + name: kubernetes-admin@kubernetes +current-context: kubernetes-admin@kubernetes +kind: Config +preferences: {} +users: +- name: kubernetes-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJWkE5K2FJN0ZTV293RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRFeU1EVXhORFU1TVRsYUZ3MHlNakV5TURVeE5EVTVNakphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXhoaFYrOFd3ZDB3bmpXKzMKV1MrQ050RmlYMENXbFMrM0VKNHYrWitMbXZjckVHQmtobUwrWXlaeUJ6ZFZ3dmNKK2FHMHgwdE9wd203bzZSVApqZ1VjVUdLd0toZXQzZW5SVlM3dkJpaXdnQVF0RVRrMit0MWR5dFMyVDYrbUFkZUhnWWhBWkw2cEFpQi92anJkCmF3dk05T3o1d2o2d2dCaXFKV25SUFQ0dlQvR0lRaTFTUDh4c1QyRmVZVVRnc2hleEltNnJkVHAxeVlFZ0hhTnAKU0JhelRJaERxajFsS0twNDk5bThPQ1BpL3BCbVpxaWo0S3l2L3YzZkhVK1lmNlF1UGlSdnpnTTBrSXBYMlNFMwpFTHlpa01pMWdVYkF2VytrRmd5cjhKUlNacTl5MzZMS29KbVBmd1ExZkdGeVpDbmxrQ1FGUFlZVVdQYzN6alFJCkhUOElRd0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSUWZrME5TSjVpYW1GSjhmVWNKWExPUUVWSgpzREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZTJEM2NMbVdCczZlYmZrN3NhWi91MUE1V2Z6S01mcGI1dTdWCmZ2b1dhSXZnRUxVYTk2dS9nUDROZHVweTFXa0JLVDBpSWQwcWFKTHZXM1d0UGpheVhhSEdFbzA4bWttQXE4dGkKdjYxTHJiRkRMRk54ZEljazEzNElLMnlybTF5ZE5idkdHVUlIV0syQXY1OWdla3g5a0t4ZENGcS8yaWo3bEI0RQpsUnQ5dkxDT2lkNlZsQkFoYk81VzdIOGJ4K2wwSFlhZ3JGcU9ENnd1STRNWXNaemk0MGlIVE85Tkx2Q1JibmltCm9aR3VrcU4vT1IwVURBYUpMNWNVeDVVVjJ4R2Vqc045M0F6eFpUZjR1NytIR3BPM2J5dDUrUlpseHdFd1MzS1gKU3pZS2hGWjBrSGxaWnVFam5QS3pBeDlpVmliWXBaRnZlRGJjWEtVNzUzZWxubXB3Znc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBeGhoVis4V3dkMHdualcrM1dTK0NOdEZpWDBDV2xTKzNFSjR2K1orTG12Y3JFR0JrCmhtTCtZeVp5QnpkVnd2Y0orYUcweDB0T3B3bTdvNlJUamdVY1VHS3dLaGV0M2VuUlZTN3ZCaWl3Z0FRdEVUazIKK3QxZHl0UzJUNittQWRlSGdZaEFaTDZwQWlCL3ZqcmRhd3ZNOU96NXdqNndnQmlxSlduUlBUNHZUL0dJUWkxUwpQOHhzVDJGZVlVVGdzaGV4SW02cmRUcDF5WUVnSGFOcFNCYXpUSWhEcWoxbEtLcDQ5OW04T0NQaS9wQm1acWlqCjRLeXYvdjNmSFUrWWY2UXVQaVJ2emdNMGtJcFgyU0UzRUx5aWtNaTFnVWJBdlcra0ZneXI4SlJTWnE5eTM2TEsKb0ptUGZ3UTFmR0Z5WkNubGtDUUZQWVlVV1BjM3pqUUlIVDhJUXdJREFRQUJBb0lCQUZBZGZZRFN4ZmlwZ3dHUApvZjVlMlhIa0lyM1ZPRkZqdDh6dnZRVmV3aTVOTWt4d1A1ZWVKN1hmMFpRYmpBTEt1RzBPT2plenZENlFFQ1F4CmpGMU9zZEhNNStST0tWSXJneTdKU1lBYktxN0xnWktLcWpLeEhvS3Vub0VCejhqRTZ4ZTNEQnZ5aEJYSklRREYKZTlFVU43TUN1RXdYNEhnZUFZb2FEcmFQRk1GbWZVVFdrR2MrM1grcXpuZ1Nwenl5ZFpzVk0xUnFYdnljdTkxVApEM2tSVE4rLytyVDRzb1R3VzBackhNYzJFMjJxMWdxUDdOSEMxZDZaK3YxWVVMRU9ibWtDM3F5U3hEU21Uc1pjCkZWMEZKQVMwYUJFRHluZ2F3SXEwcHhqN0ErSkx0SDFpQmJidDV2bXRTTFliSFBBWUxweVIzY2lUUzMxYWRQRUEKNU9OaDE5a0NnWUVBL1VVQnlwOGU4VjQ1cGl4VGx2K281cnYzTUU0cStMQ2lBalZhakdPaFpRTmh2VFpQQmhrbwpsbmhWbU5wUnhUZHlLUkxRcU8rNndXa25VenR4eElBUWhhNlZRVXBDUzBDYzh2VCtVY2hEWE9BVTBGVURuUHJ6CkpOUTZYdlpBWjJPbDNRNUN4K1M3TEpIVnBzT1RlTlBCdDlpVWhRRkswdzI0MG4yV1hvN0ozMFVDZ1lFQXlEc04KMDlEd1dWREFxVlZ6dVVKMFZPc0RVRXFudVJFNWhDdnNtTDJMelJlcFZoVlNXaGwrMlpObVBqYlNLSThwM3d2bwpObXZ1Um1NUysrT3daTmdYYUFJbFRFbW5NVm55ckZrdUY3TWpUNHNnZUIrdHRSODV3b2pBaFcwTkVHMFZLdnZXCnVSajJLRFRmODlMcDBlN2JWeUtqN09QSEZOSFdFaVFCTE90NDNlY0NnWUVBdENjVzNDTU5acEVvbnB3ZkpXUmIKcHl5QzZ2aGZOcUNsekw1WTEwMnpLdUFaOFBZbGhlZjFaL3JXb0RDRFE2NXA1TzkrUHZ5dk1nNXpLNUE0SDVjYwpxWXFDbm51TTVteGlkNnR2RDR0TTUwNTVYNnRwTTR1SjBtT24xWTZDUjBpcFhiRmNMVVgxSWdIbUlJWXpheG50ClRMR2hDMjdjNDMxNlB6ZVg4MURNSmFVQ2dZQk15TGlvdmJzdHhSWGMyZlFpMnlVWlczWk4yQk14bVRWaFJpYlkKKy9jY2t6SlEzS1JVQU9yd0xPSk1nV0ZlUkdoZUxJYkVOK2VML25wTk5pZHl4SnRWTzExcVArUnB2SUNmTHlQSgoydHh6cUhxdkZoYmJHanBnSzJrSXdhVDg0NWYyZjlUNzdtS1hVSStCUlNSOWFRZWNCcUN1T3pzZzlNY085ZGV0CmppOHZpUUtCZ1FEUWJldm9UenNZckcvQ1RLeUZoc3RoMFNNQk1xbXlkOU5RamE2dkVaUzlzTTVOOGNCbVQyODIKc2ZiWnRYa1RMSXlSeFUvVkpDcE4zMmw0YzA1bkhTdEtiQllaTDZvbFMxMURtZW5Wbkc5cXZQWHQ5blpkZDNmZAp0ZjFwUFdCQXJkUlJlUWRFTElOUytCNHpEQlFOdXlHSnNuRTRLNktkTE1ndWgwMEZBK0hXRUE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= diff --git a/syncimages/dispatch.sh b/syncimages/dispatch.sh new file mode 100644 index 0000000..299371f --- /dev/null +++ b/syncimages/dispatch.sh @@ -0,0 +1,102 @@ +#!/bin/sh + +if [ x${1} = x ]; then + echo -e "\033[31m 请在第一个命令行参数指定 *-images.txt 文件 \033[0m" + exit +fi + +if [ ! -f "${1}" ]; then + echo -e "\033[31m 文件 ${1} 不存在 \033[0m" + exit +fi + +if [ x${2} = x ]; then + echo -e "\033[31m 请在第二个命令行参数指定 target-hosts.txt 文件 \033[0m" + exit +fi + +if [ ! -f "${2}" ]; then + echo -e "\033[31m 文件 ${2} 不存在 \033[0m" + exit +fi + +read line < ${2} + +prvKey=$(echo ${line}) + +if [ ! -f "${prvKey}" ]; then + echo -e "\033[31m 文件 '${prvKey}' 不存在,请在文件 ${2} 的第一行指定 ssh privateKey 的路径 \033[0m" + exit +fi + +while read line +do + let count++ + if [ ${count} -gt 1 ]; then + + line=$(echo $line) + + if [ x${line} = x ]; then + continue + fi + + user=$(echo ${line%@*}) + ipport=$(echo ${line#*@}) + ip=$(echo ${ipport%:*}) + port=$(echo ${ipport#*:}) + + if [ x${user} = x${line} -o x${ip} = x${ipport} -o x${port} = x${ipport} ]; then + echo -e "\033[31m 文件 ${2} 的第 ${count} 行应该符合 user@192.168.2.10:22 的格式,当前该行内容为: \033[0m" + echo ${line} + exit + fi + + hostIndex=`expr ${count} - 1` + echo -e "\033[36m>>>>> 开始分发镜像到第 ${hostIndex} 个目标主机 ${ip} >>>>>\033[0m" + scp -P ${port} -i ${prvKey} ${1} ${user}@${ip}:~/ + + ssh -p ${port} -i ${prvKey} ${user}@${ip} "rm -rf ${1%???????} || true +echo -e \"\033[36mstep ${hostIndex}.1 解压缩\033[0m\" +tar zxvf ${1} +echo -e \"\033[36mstep ${hostIndex}.2 加载镜像\033[0m\" +while read line +do + let c++ + line=\$(echo \${line}) + if [ x\${line} = x ]; then + echo -e \"Step ${hostIndex}.2.\${c} \033[33m第 \${c} 行为空\033[0m\" + continue + fi + echo -e \"Step ${hostIndex}.2.\${c} docker load < ${1%???????}/\${line//\//_}.tar \\t \\c\" + line=\$(echo \$line) + docker load < ${1%???????}/\${line//\//_}.tar +done < ${1%???????}/images.txt + +echo -e \"\033[36m加载到目标主机 ${ip} 的镜像如下\033[0m\" +echo -e \"IMAGE ID\t CREATED\t\tSIZE\t\t REPOSITORY:TAG\" +while read line +do + line=\$(echo \${line}) + if [ x\${line} = x ]; then + continue + fi + tag=\$(echo \${line%:*}) + version=\$(echo \${line%:*}) + docker images \${line} --format \"table {{.ID}}\t{{.CreatedSince}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}\" | grep \${tag} | grep \${version} +done < ${1%???????}/images.txt + +echo +echo -e \"\033[36m清理目标主机 ${ip} 上的临时文件\033[0m\" +rm -rf ${1%???????} || true +rm -rf ${1} || true +echo +" < /dev/null + + echo -e "\033[32m<<<<< 已结束将镜像分发到第 ${hostIndex} 个目标主机 ${ip} <<<<<\033[0m" + echo "" + fi +done < ${2} + +echo -e "\033[32m----- 已结束将镜像分发到 ${2} 文件中定义的所有主机 -----\033[0m" + +echo "" diff --git a/syncimages/harbor.py b/syncimages/harbor.py new file mode 100644 index 0000000..565fd42 --- /dev/null +++ b/syncimages/harbor.py @@ -0,0 +1,35 @@ +import requests +from urllib import parse + +session = requests.Session() +HEADERS = {'Content-Type': 'application/x-www-form-urlencoded'} + + +def get_session(): + payload = {"principal": 'admin', "password": 'Harbor12345'} + data = parse.urlencode(payload) + r = session.post("https://repository.anxinyun.cn/login", headers=HEADERS, data=data) + print(r.status_code) + + +def get_all_project(): + url = "https://repository.anxinyun.cn/api/projects?page=1&page_size=100" + rs = session.get(url) + if rs.status_code == 200: + projects = dict() + for p in rs.json(): + projects[p['name']] = p['project_id'] + return projects + + +def get_image_latest_tag(project, image): + url = "https://repository.anxinyun.cn/api/repositories/{}/{}/tags?detail=1".format(project, image) + r = session.get(url) + if r.status_code == 200: + tags = list(map(lambda t: {'created': t['created'], 'tag': t['name']}, r.json())) + tags.sort(key=lambda x: x['created'], reverse=True) + return tags[0]['tag'] if len(tags) == 1 else tags[0]['tag'] if tags[0]['tag'] != 'latest' else tags[1]['tag'] + # if len(tags) >= 2: + # return tags[0]['tag'] if tags[0]['tag'] != 'latest' else tags[1]['tag'] + # else: + # return tags[0]['tag'] diff --git a/syncimages/hosts.txt b/syncimages/hosts.txt new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images.txt b/syncimages/images.txt new file mode 100644 index 0000000..1f8f5f2 --- /dev/null +++ b/syncimages/images.txt @@ -0,0 +1,86 @@ +repository.anxinyun.cn/anxinyun/actionview-dashboard:11.21-12-09 +repository.anxinyun.cn/firecontrol/anfang-2b-datapush:44.22-04-21 +repository.anxinyun.cn/firecontrol/anfangdatapush:22.22-01-21 +repository.anxinyun.cn/firecontrol/anfangweb-2b:190.22-04-20 +repository.anxinyun.cn/firecontrol/anfangapi-2bctrl:76.22-04-20 +repository.anxinyun.cn/firecontrol/anfangweb-2bctrl:47.22-04-20 +repository.anxinyun.cn/firecontrol/anfangweb:31.22-01-21 +repository.anxinyun.cn/firecontrol/anfangapi:39.22-01-21 +repository.anxinyun.cn/smartcity/smartsafety-console:31.21-12-20 +repository.anxinyun.cn/smartcity/worksafety-webapi:21-07-01.15 +repository.anxinyun.cn/smart/camundademo:22-04-12.24 +repository.anxinyun.cn/anxinyun/config_center:35.21-07-16 +repository.anxinyun.cn/anxinyun/console-web:143.22-03-23 +repository.anxinyun.cn/anxincloud/et.iotaraw:20-11-10.1 +repository.anxinyun.cn/anxincloud/et.iotaraw:4.21-04-09 +repository.anxinyun.cn/anxin/iota-proxy:38.21-11-29 +repository.anxinyun.cn/anxin/iota-proxy:dragon.33 +repository.anxinyun.cn/anxin/iota-proxy:dragon.33 +repository.anxinyun.cn/anxinyun/receiver:12.21-04-15 +repository.anxinyun.cn/shushijia/web:106.22-02-28 +repository.anxinyun.cn/shushijia/webapi:333.22-04-11 +repository.anxinyun.cn/anxinyun/weather:dragon.3 +repository.anxinyun.cn/anxincloud/weather-history:11.21-04-02 +repository.anxinyun.cn/smart/camundademo:22-04-18.25 +repository.anxinyun.cn/smart/camundademo:22-04-08.23 +repository.anxinyun.cn/shushijia/datapush:62.21-03-16 +repository.anxinyun.cn/shushijia/report:69.22-04-13 +repository.anxinyun.cn/shushijia/report-web:112.22-04-13 +repository.anxinyun.cn/anxinyun/weatherhttp:20-10-22.1 +repository.anxinyun.cn/projectmanagement/emis.webapi:214.22-04-20 +repository.anxinyun.cn/projectmanagement/emis.webapi:186.22-04-11 +repository.anxinyun.cn/projectmanagement/emis.web:300.22-04-21 +repository.anxinyun.cn/projectmanagement/emis.web:271.22-04-12 +repository.anxinyun.cn/fs-env/env.api:113.22-04-06 +repository.anxinyun.cn/fs-env/api.public:dragon.9 +repository.anxinyun.cn/smartcity/zhujianju-console:114.21-04-29 +repository.anxinyun.cn/anxinyun/zhujianju:66.21-05-08 +repository.anxinyun.cn/devops/flink:1.9.3-scala_2.11 +repository.anxinyun.cn/devops/flink:1.9.3-scala_2.11 +repository.anxinyun.cn/smartsite/shunkongsite-api:8.22-04-01 +repository.anxinyun.cn/smartsite/shunkongsite-web:13.22-04-20 +repository.anxinyun.cn/anxinyun/console-web:11.22-04-15 +repository.anxinyun.cn/anxinyun/api:13.22-04-15 +repository.anxinyun.cn/smartcity/filemanagement.api:7.22-04-08 +repository.anxinyun.cn/smartcity/filemanagement.web:17.22-04-20 +repository.anxinyun.cn/smartsite/jingdezhen-api:70.22-04-18 +repository.anxinyun.cn/smartsite/jingdezhen_web:114.22-04-18 +repository.anxinyun.cn/smartsite/process:54.22-02-24 +repository.anxinyun.cn/anxinyun/gonghui:237.22-04-20 +repository.anxinyun.cn/projectmanagement/oa.web:53.22-04-13 +repository.anxinyun.cn/projectmanagement/oa.web:45.22-03-25 +repository.anxinyun.cn/projectmanagement/pep.web:67.22-04-20 +repository.anxinyun.cn/projectmanagement/pep.web:53.22-03-25 +repository.anxinyun.cn/projectmanagement/pg.web:393.22-04-13 +repository.anxinyun.cn/projectmanagement/pg.web:389.22-04-01 +repository.anxinyun.cn/projectmanagement/pg.webapi:320.22-04-21 +repository.anxinyun.cn/projectmanagement/pg.webapi:311.22-04-09 +repository.anxinyun.cn/smartcity/smart-emergency-api:37.22-04-19 +repository.anxinyun.cn/device/emergency_reportservice:43.22-03-30 +repository.anxinyun.cn/smartcity/smartemergency-web:20.22-03-30 +repository.anxinyun.cn/smartsite/web:408.22-04-20 +repository.anxinyun.cn/smartsite/et-smartsite:19.21-12-29 +repository.anxinyun.cn/smartsite/process:54.22-02-24 +repository.anxinyun.cn/smartsite/smartsite-api:225.22-04-07 +repository.anxinyun.cn/smartsite/ghm-webconsole:peter.32 +repository.anxinyun.cn/smartsite/gmh-webapi:peter.28 +repository.anxinyun.cn/smartcity/smarttourism-console:20.22-04-20 +repository.anxinyun.cn/smartcity/smarttourism-process:21-09-27.33 +repository.anxinyun.cn/smartcity/smarttourism-webapi:21-09-27.99 +repository.anxinyun.cn/smartwater/smartwater.web:55.21-12-03 +repository.anxinyun.cn/smartwater/smartwater.api:21.21-11-16 +repository.anxinyun.cn/smartsite/tianjinapi:9.22-04-12 +repository.anxinyun.cn/smartsite/tianjinweb:30.22-04-18 +repository.anxinyun.cn/toilet/toilet.web:70.22-04-20 +repository.anxinyun.cn/toilet/toilet.api:30.21-10-11 +repository.anxinyun.cn/anxin/tool-api:dragon.4 +repository.anxinyun.cn/smartchangnan/new_web:11.22-04-14 +repository.anxinyun.cn/anxinyun/api:11.22-04-15 +repository.anxinyun.cn/smartcity/xiaolanfangyivideo-console:6.22-04-03 +repository.anxinyun.cn/smartsite/smartsitezq.api:3.22-03-17 +repository.anxinyun.cn/smartcity/xiaolan-web:13.21-12-27 +repository.anxinyun.cn/smartcity/xiaolan-webapi-new:21-12-18.25 +repository.anxinyun.cn/firecontrol/anfangapi:39.22-01-21 +repository.anxinyun.cn/firecontrol/anfangweb:31.22-01-21 +repository.anxinyun.cn/smartsite/smartsitezq-api:2.22-03-22 +repository.anxinyun.cn/smartsite/zqweb:2.22-03-22 diff --git a/syncimages/images/repository.anxinyun.cn_anxin_iota-proxy38.21-11-29.tar b/syncimages/images/repository.anxinyun.cn_anxin_iota-proxy38.21-11-29.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxin_iota-proxydragon.33.tar b/syncimages/images/repository.anxinyun.cn_anxin_iota-proxydragon.33.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxincloud_et.iotaraw20-11-10.1.tar b/syncimages/images/repository.anxinyun.cn_anxincloud_et.iotaraw20-11-10.1.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxincloud_et.iotaraw4.21-04-09.tar b/syncimages/images/repository.anxinyun.cn_anxincloud_et.iotaraw4.21-04-09.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxinyun_actionview-dashboard11.21-12-09.tar b/syncimages/images/repository.anxinyun.cn_anxinyun_actionview-dashboard11.21-12-09.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxinyun_config_center35.21-07-16.tar b/syncimages/images/repository.anxinyun.cn_anxinyun_config_center35.21-07-16.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxinyun_console-web143.22-03-23.tar b/syncimages/images/repository.anxinyun.cn_anxinyun_console-web143.22-03-23.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_anxinyun_receiver12.21-04-15.tar b/syncimages/images/repository.anxinyun.cn_anxinyun_receiver12.21-04-15.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfang-2b-datapush44.22-04-21.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfang-2b-datapush44.22-04-21.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfangapi-2bctrl76.22-04-20.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfangapi-2bctrl76.22-04-20.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfangapi39.22-01-21.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfangapi39.22-01-21.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfangdatapush22.22-01-21.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfangdatapush22.22-01-21.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfangweb-2bctrl47.22-04-20.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfangweb-2bctrl47.22-04-20.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfangweb-2b190.22-04-20.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfangweb-2b190.22-04-20.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_firecontrol_anfangweb31.22-01-21.tar b/syncimages/images/repository.anxinyun.cn_firecontrol_anfangweb31.22-01-21.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_shushijia_web106.22-02-28.tar b/syncimages/images/repository.anxinyun.cn_shushijia_web106.22-02-28.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_smart_camundademo22-04-12.24.tar b/syncimages/images/repository.anxinyun.cn_smart_camundademo22-04-12.24.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_smartcity_smartsafety-console31.21-12-20.tar b/syncimages/images/repository.anxinyun.cn_smartcity_smartsafety-console31.21-12-20.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/images/repository.anxinyun.cn_smartcity_worksafety-webapi21-07-01.15.tar b/syncimages/images/repository.anxinyun.cn_smartcity_worksafety-webapi21-07-01.15.tar new file mode 100644 index 0000000..e69de29 diff --git a/syncimages/k8s.py b/syncimages/k8s.py new file mode 100644 index 0000000..f4e7cdc --- /dev/null +++ b/syncimages/k8s.py @@ -0,0 +1,36 @@ +from kubernetes import client, config + +config.load_kube_config("D:/workspace/pythonprojects/syncimages/config") +apps_v1 = client.AppsV1Api() + +core_v1 = client.CoreV1Api() + + +def list_deployment(ns): + image_list = [] + deploy_list = apps_v1.list_namespaced_deployment(namespace=ns).items + for item in deploy_list: + if item.spec.template.spec.containers[0].image.startswith('repository.anxinyun.cn'): + project_image = get_project(item.spec.template.spec.containers[0].image) + image_tag = get_image_tag(project_image[2]) + image_list.append({'project': project_image[1], 'name': image_tag[0], 'tag': image_tag[1]}) + return image_list + + +def get_project(image_url): + return image_url.split("/") + + +def get_image_tag(image): + return image.split(":") + + +def list_node(): + nodes = core_v1.list_node() + for node in nodes.items: + print(node.metadata.name) + + +if __name__ == '__main__': + list_deployment() + # print(get_project('repository.anxinyun.cn/anxinyun/actionview-dashboard:11.21-12-09')) diff --git a/syncimages/pull.sh b/syncimages/pull.sh new file mode 100644 index 0000000..a3901e1 --- /dev/null +++ b/syncimages/pull.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +folder=${1%.*} + +echo ${folder} + +if [ x"${folder}" = x ]; then + echo -e "\033[31m 请指定 *-images.txt 文件 \033[0m" + exit +fi + +echo "" +echo "创建临时文件夹 ${folder}" +echo "" +rm -rf ${folder} || true +mkdir ${folder} + +while read line +do + let count++ + line=$(echo $line) + if [ x${line} = x ]; then + echo -e "\033[33m第 ${count} 行为空\033[0m" + echo + continue + fi + echo ">>>>> 下载第 ${count} 个镜像 ${line} >>>>>" + docker pull $line; + echo -e "\033[32m<<<<< 保存第 ${count} 个镜像到 ${folder}/${line//\//_}.tar \033[0m"; + docker save $line > ${folder}/${line//\//_}.tar; + echo "" +done < ${1} + +echo "----- 创建压缩文件 ${folder}.tar.gz -----" +cp ${1} ${folder}/images.txt +tar -zcvf ${folder}.tar.gz ${folder}/*.tar ${folder}/images.txt + +echo -e "\033[32m----- 已压缩到文件 ${folder}.tar.gz ----- \033[0m" +echo -e "文件大小为 \c" +ls -hl ${folder}.tar.gz | awk '{print $5}' + +echo "" +echo "清除临时文件夹 ${folder}" +rm -rf ${folder} + +echo "" +echo "请执行以下指令,将镜像分发到 ./target-hosts.txt 文件中定义的目标主机上。" +echo -e "\033[36m./dispatch.sh ${folder}.tar.gz target-hosts.txt \033[0m" +echo ""