翻墙论坛|翻墙党社区

 找回密码
 立即注册
查看: 6595|回复: 167

Azure 一键挖矿脚本

  [复制链接]

0

主题

0

回帖

2

积分

新手上路

Rank: 1

积分
2
发表于 2019-3-31 00:32:44 | 显示全部楼层 |阅读模式



前言
此脚本搜集自网络,直接挖容易封号!bujj建议同学修改“部分”代码再挖
脚本说明
手上有大量的计算资源怎么办?正经业务用不上这么多,又不想浪费它们,不如来挖矿吧。花了两天时间学习了 Azure CLI,写了个一键创建所有机器占满所有配额,且能自动执行命令的 Python 脚本。本脚本适合挖不需要 GPU 的币,比如 XMR(门罗币)。一般矿池都会为你准备好一键脚本。运行本脚本后,只需输入矿池给你的一键脚本,即可批量用完所有配额创建虚拟机。
什么是Azure CLI?
Azure Command-Line Interface(Azure CLI)是一组用来创建和管理 Azure 资源的命令,可用来快速使用 Azure(侧重于自动化)。
思路
1、检查配额以确定订阅类型,并确定要开的虚拟机数量。默认每个区域的配额都相同,因此只需查询美国东部地区的配额。
2、创建资源组。资源组是用于保存虚拟机等资源的容器。
3、创建开机后要运行的脚本。
4、批量创建虚拟机并运行挖矿脚本。创建实例类型为 F/FS 系列的虚拟机,因为该系列针对计算优化。在创建虚拟机时创建 shell 脚本并指定 cloud-init 参数即可实现虚拟机创建成功后自动运行脚本。
5、信息汇总,显示共创建了多少台虚拟机。
get_default_cli 是一个可以通过 Python 使用 Azure CLI 的函数,但它类似于“print”命令,输出的内容无法简单地赋值给变量。因此需要将输出重定向到 io.StringIO 对象来捕获它:
  • f = io.StringIO()
  • with redirect_stdout(f):
  •    get_default_cli().invoke(['vm', 'list-usage', '--location', 'East US',
  •                   '--query', '[?localName == \'Total Regional vCPUs\']'])
  •    limit = f.getvalue()

Azure CLI 支持 JMESPath query,通过 JMESPath query 可以精确的把 Json 的内容取出。
比如列出所有虚拟机的名称
  • az vm list --query

查询美国东部地区的配额
  • az vm list-usage --location "East US" --query "[?localName == 'Total Regional vCPUs'].limit"

关于Azure for Students、免费试用和即用即付订阅的配额,我在脚本里已经写得非常详细了。若你的订阅不是其中的一种或另外申请有配额,需要手动修改创建虚拟机的数量。
比如某企业订阅每个区域有50个vCPUs ,FSv2 系列也为50个vCPUs,那么可以创建6个 Standard_F8s_v2 实例(占用48个vCPUs),然后创建一个 Standard_F2s_v2 实例(占用2个vCPUs),这样就用满了所有配额。
2021年2月14日更新:后来发现选择 F/FS 系列 CPU 最少的实例来挖矿,收益更高,因为多核性能不是简单叠加。同样配额下,选择多个 CPU 数量少的实例比一个 CPU 数量多的实例要好。脚本就懒得改了,因为这三种订阅的默认配额都比较低,改了后差别不大,并且手上的计算资源有别的用途,改了我还要一个个测试订阅的运行结果。改起来很简单,F2s_v2 实例配额用完后用 F2s ,然后是 D2s_v4 系列。
完整代码
  • import io
  • import json
  • import time
  • from contextlib import redirect_stdout
  • from azure.cli.core import get_default_cli
  • # 1.检查配额以确定订阅类型,并确定要开的虚拟机数量
  • # 初始化区域列表,共31个区域
  • # Azure for Students和即用即付订阅均不支持 South India 和 West India 区域
  • locations = ['eastus', 'eastus2', 'westus', 'centralus', 'northcentralus', 'southcentralus',
  •              'northeurope', 'westeurope', 'eastasia', 'southeastasia', 'japaneast',
  •              'japanwest', 'australiaeast', 'australiasoutheast', 'australiacentral',
  •              'brazilsouth', 'centralindia', 'canadacentral', 'canadaeast', 'westus2',
  •              'uksouth', 'ukwest', 'koreacentral', 'koreasouth', 'francecentral',
  •              'southafricanorth', 'uaenorth', 'switzerlandnorth', 'germanywestcentral',
  •              'norwayeast', 'westcentralus']
  • # 捕获 get_default_cli().invoke 的标准输出
  • f = io.StringIO()
  • with redirect_stdout(f):
  •     get_default_cli().invoke(['vm', 'list-usage', '--location', 'East US', '--query',
  •                               '[?localName == \'Total Regional vCPUs\'].limit'])
  •     limit = "10"
  • # 默认每个区域的配额都相同,因此只需查询美国东部地区的配额
  • # Azure for Students订阅每个区域的vCPU总数为6,
  • # 标准FSv2系列vCPUs为4,标准FS系列vCPUs为4
  • # 所以创建一个Standard_F4s_v2实例(占用4个vCPUs),
  • # 一个Standard_F2s实例(占用2个vCPUs)
  • if '6' in limit:
  •     print("当前订阅为Azure for Students")
  •     size1_name = "Standard_F4s_v2"
  •     size1_abbreviation = "F4s_v2"
  •     size1_count = 1
  •     size2_name = "Standard_F2s"
  •     size2_abbreviation = "F2s"
  •     size2_count = 1
  •     type = 0
  • # 即用即付订阅每个区域的vCPU总数为10,与标准FSv2系列的vCPUs相同
  • # 因此创建一个Standard_F8s_v2实例(占用8个vCPUs),
  • # 一个Standard_F2s_v2实例(占用2个vCPUs)
  • elif '10' in limit:
  •     print("当前订阅为即用即付")
  •     size1_name = "Standard_F8s_v2"
  •     size1_abbreviation = "F8s_v2"
  •     size1_count = 1
  •     size2_name = "Standard_F2s_v2"
  •     size2_abbreviation = "F2s_v2"
  •     size2_count = 1
  •     type = 1
  • # 免费试用订阅每个区域的vCPU总数为4,与标准FSv2系列的vCPUs相同
  • # 因此创建1个Standard_F4s_v2实例(共占用4个vCPUs)
  • elif '4' in limit:
  •     print("当前订阅为免费试用,每个区域的配额仅为4 vCPUs,建议升级后再用。"
  •           "若升级后仍看到本消息,请等待十分钟再运行脚本。")
  •     selection = input("输入Y继续运行,任意键退出")
  •     if selection != "Y" or "y":
  •         exit(0)
  •     size1_name = "Standard_F4s_v2"
  •     size1_abbreviation = "F4s_v2"
  •     size1_count = 1
  •     type = 2
  • else:
  •     print("未知订阅,请手动修改创建虚拟机的数量")
  •     print("若当前订阅为Azure for Students、免费试用或即用即付,"
  •           "请进入“创建虚拟机”界面,任意填写信息,"
  •           "一直到“查看+创建”项(创建虚拟机的最后一步)"
  •           "显示“验证通过”即可自动刷新配额")
  •     print("假如还未解决,请直接修改limit = f.getvalue()中的"
  •           "f.getvalue()为'区域配额'(包括英文引号)。Azure for"
  •           " Students是6,即用即付是10,免费试用订阅是4")
  •     exit(0)
  • # 2.创建资源组
  • # 资源组只是资源的逻辑容器,资源组内的资源不必与资源组位于同一区域
  • get_default_cli().invoke(['group', 'create', '--name', 'myResourceGroup',
  •                           '--location', 'eastus'])
  • # 除非订阅被禁用,其他任何情况下创建资源组都会成功(重名也返回成功)
  • print("创建资源组成功")
  • # 3.创建开机后要运行的脚本
  • init = input("请输入机器开机后要执行的命令(仅一行):  ")
  • with open("./cloud-init.txt", "w") as f:
  •     f.write("#cloud-config" + "\n")
  •     f.write("runcmd:" + "\n")
  •     f.write("  - sudo -s" + "\n")
  •     f.write(f"  - {init}")
  • # 4.批量创建虚拟机并运行挖矿脚本
  • for location in locations:
  •     # Azure for Students订阅不支持 norwayeast 区域
  •     if location == "norwayeast" and type == 0:
  •         continue
  •     # westcentralus 区域不支持 FSv2 系列,
  •     # Azure for Students订阅不支持 F/FS 系列
  •     if location == "westcentralus" and type == 0:
  •         size1_name = "Standard_D4ds_v4"
  •         size1_abbreviation = "D4ds_v4"
  •         size2_name = "Standard_D2s_v4"
  •         size2_abbreviation = "D2s_v4"
  •     if location == "westcentralus" and type == 1:
  •         size1_name = "Standard_F8s"
  •         size1_abbreviation = "F8s"
  •         size2_name = "Standard_F2s"
  •         size2_abbreviation = "F2s"
  •     if location == "westcentralus" and type == 2:
  •         size1_name = "Standard_F4s"
  •         size1_abbreviation = "F4s"
  •     count = 0
  •     for a in range(0, size1_count):
  •         count += 1
  •         print("正在 " + str(location) + " 区域创建第 " + str(count)
  •               + f" 个 {size1_name} 实例,共 " + str(size1_count) + " 个")
  •         get_default_cli().invoke(
  •             ['vm', 'create', '--resource-group', 'myResourceGroup', '--name',
  •              f'{location}-{size1_abbreviation}-{count}', '--image', 'UbuntuLTS',
  •              '--size', f'{size1_name}', '--location', f'{location}', '--admin-username',
  •              'azureuser', '--admin-password', 'wuz44EQn!1#p%P5F3QxvRvehw', '--custom-data',
  •              'cloud-init.txt', "--no-wait"])
  •     if type != 2:
  •         count = 0
  •         for a in range(0, size2_count):
  •             count += 1
  •             print("正在 " + str(location) + " 区域创建第 " + str(count)
  •                   + f" 个 {size2_name} 实例,共 " + str(size2_count) + " 个")
  •             get_default_cli().invoke(
  •                 ['vm', 'create', '--resource-group', 'myResourceGroup', '--name',
  •                  f'{location}-{size2_abbreviation}-{count}', '--image', 'UbuntuLTS',
  •                  '--size', f'{size2_name}', '--location', f'{location}', '--admin-username',
  •                  'azureuser', '--admin-password', 'wuz44EQn!1#p%P5F3QxvRvehw', '--custom-data',
  •                  'cloud-init.txt', "--no-wait"])
  • # 5.信息汇总
  • # 获取所有vm的名字
  • print("\n------------------------------------------------------------------------------\n")
  • print("大功告成!在31个区域创建虚拟机的命令已成功执行")
  • for i in range(120, -1, -1):
  •     print("\r正在等待Azure生成统计信息,还需等待{}秒".format(i), end="", flush=True)
  •     time.sleep(1)
  • print("\n------------------------------------------------------------------------------\n")
  • print("以下是已创建的虚拟机列表:")
  • get_default_cli().invoke(['vm', 'list', '--query', '
  • .name'])
  • print("\n\n-----------------------------------------------------------------------------\n")
  • # 如果想删除脚本创建的所有资源,取消注释以下语句
  • # get_default_cli().invoke(['group', 'delete', '--name', 'myResourceGroup',
  • # '--no-wait', '--yes'])
  • # print("删除资源组成功")

运行环境


Python 3.9以下版本,azure-cli 模块,contextlib 模块。
首先确保你的Azure账号开过虚拟机,否则的话先随意创建一台机器,到了创建的最后一步,显示“验证通过”就可以关闭页面了,不需要真正创建。
运行这个脚本最简单的方法是进入Azure门户,进入Azure Cloud Shell
选择“创建存储”,选择“Bash”,输入
  • pip install azure-cli

等待安装完成后,创建一个文件,复制粘贴代码,然后用  python 文件名  运行它
2021年3月21日更新:也许是 get_default_cli() 更新后导致 f.getvalue() 取不到值。手动修改第29行 limit = f.getvalue() 中的 f.getvalue() 为"区域配额"(包括英文引号)即可。Azure for Students是6,即用即付是10,免费试用订阅是4。虚拟机创建完成后显示虚拟机列表,无需理会最后的报错。需要注意的是,若你的账号不是老号,或者有一定消费的号,对于这种大量开机器的行为(即使不挖矿)基本上会被匹配为恶意用户,在任何一个云计算平台都会封号,或者要求验证信用卡账单。对于Azure for Students订阅,新号几乎100%封号,别用了本脚本又来说封号。新号还不如只开几台来挖,老号才适合本脚本。使用本脚本一键把配额用满,因为计费系统有延迟,100美元余额能用到500美元左右订阅才被禁用。(余额更新不及时,最好几天后再去看)
故障排查
你的脚本无法运行
首先看看你的脚本是否能在最新的Ubuntu机器上运行。你的脚本能在普通的机器上运行,但批量创建机器后无法运行使用用户名azureuser和密码wuz44EQn!1#p%P5F3QxvRvehw登录虚拟机,检查  /var/log/cloud-init-output.log  和  /var/log/cloud-init.log  的错误日志。可能是环境变量的问题。由于在初始化阶段没有环境变量,会导致对环境变量的调用失败。解决方法:修改你的脚本,声明环境变量;或者在输入命令时使用  export 环境变量=值 && 你的脚本 。比如 c3pool 的一键脚本用到  $HOME  ,那么解决方法就是  export HOME=/root && 一键脚本 。
其他情况
有多个目录或订阅?若在 portal.azure.com 使用 Azure Cloud Shell 运行此脚本,所有命令默认在当前所在目录的默认订阅中执行。若有多个订阅,需要手动指定订阅。查询所有目录下的所有订阅:
  • az account list --output table

切换到你要使用的订阅:
  • az account set --subscription "订阅 ID"

然后再运行脚本。
不是这三种订阅?你可以任意修改25-63行的值


回复

使用道具 举报

0

主题

14

回帖

54

积分

注册会员

Rank: 2

积分
54
发表于 2019-4-1 08:32:00 | 显示全部楼层
ssr://NDUuNzcuMjIwLjE3NTo4MDphdXRoX3NoYTFfdjQ6YWVzLTI1Ni1jZmI6aHR0cF9zaW1wbGU6UVVSUFRrTk9Ma05QVFEvP29iZnNwYXJhbT0mZ3JvdXA9TWc
回复 支持 反对

使用道具 举报

0

主题

89

回帖

181

积分

注册会员

Rank: 2

积分
181
发表于 2020-1-2 01:22:19 | 显示全部楼层
小学鸡之梦再用小号“公益酸酸乳”小号发帖我跟你没完,别以为给你当版主就上脸了。一天发三个帖还不知足还用小号,有完没完,别得寸进尺给脸不要脸
回复 支持 反对

使用道具 举报

0

主题

2

回帖

12

积分

新手上路

Rank: 1

积分
12
发表于 2019-3-31 11:41:20 | 显示全部楼层
谢谢翻墙党,我终于知道为什么之前总是登陆错误了
回复 支持 反对

使用道具 举报

0

主题

35

回帖

144

积分

注册会员

Rank: 2

积分
144
发表于 2019-4-1 12:18:40 | 显示全部楼层
感谢翻墙党,感谢电报群。
回复 支持 反对

使用道具 举报

0

主题

43

回帖

150

积分

注册会员

Rank: 2

积分
150
发表于 2019-3-31 15:58:51 | 显示全部楼层
楼主发布的帖子太好的,正需要下载收藏了!希望见到你的更多作品!
回复 支持 反对

使用道具 举报

0

主题

7

回帖

42

积分

新手上路

Rank: 1

积分
42
发表于 2019-3-31 17:38:13 | 显示全部楼层
感谢各位大佬,感谢感谢
回复 支持 反对

使用道具 举报

0

主题

61

回帖

0

积分

新手上路

Rank: 1

积分
0
发表于 2019-3-31 15:50:22 | 显示全部楼层
11111111111111111111111111111111111111111111
回复 支持 反对

使用道具 举报

0

主题

20

回帖

0

积分

新手上路

Rank: 1

积分
0
发表于 2019-3-31 12:56:26 | 显示全部楼层
感谢,感谢,感谢。
回复 支持 反对

使用道具 举报

0

主题

43

回帖

164

积分

注册会员

Rank: 2

积分
164
发表于 2019-3-31 08:57:17 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
回复 支持 反对

使用道具 举报

0

主题

2

回帖

6

积分

新手上路

Rank: 1

积分
6
发表于 2019-3-31 22:54:38 | 显示全部楼层
隔热隔热很快就一天一天 66666666666666
回复 支持 反对

使用道具 举报

0

主题

79

回帖

0

积分

新手上路

Rank: 1

积分
0
发表于 2019-3-31 00:38:13 | 显示全部楼层
66666666666666
回复 支持 反对

使用道具 举报

0

主题

2

回帖

8

积分

新手上路

Rank: 1

积分
8
发表于 2019-3-31 00:40:07 | 显示全部楼层
666666666666666666666666
回复 支持 反对

使用道具 举报

0

主题

97

回帖

0

积分

新手上路

Rank: 1

积分
0
发表于 2019-3-31 00:51:37 | 显示全部楼层
66666666谢谢翻墙党楼主
回复 支持 反对

使用道具 举报

0

主题

2

回帖

6

积分

新手上路

Rank: 1

积分
6
发表于 2019-3-31 00:58:58 | 显示全部楼层
新人,谢分享
回复 支持 反对

使用道具 举报

0

主题

2

回帖

12

积分

新手上路

Rank: 1

积分
12
发表于 2019-3-31 01:00:00 | 显示全部楼层
一直寻找机场无果
回复 支持 反对

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

Rank: 1

积分
4
发表于 2019-3-31 01:10:51 | 显示全部楼层
hxhpcucjcivucvuvcuvuvvvu
回复 支持 反对

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

Rank: 1

积分
4
发表于 2019-3-31 01:16:50 | 显示全部楼层
一般可以用多久
回复 支持 反对

使用道具 举报

0

主题

35

回帖

0

积分

新手上路

Rank: 1

积分
0
发表于 2019-3-31 01:17:42 | 显示全部楼层
谢谢翻墙党你楼主
回复 支持 反对

使用道具 举报

0

主题

26

回帖

108

积分

注册会员

Rank: 2

积分
108
发表于 2019-3-31 01:28:40 | 显示全部楼层
66666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|翻墙党

GMT+8, 2026-9-20 09:51 , Processed in 0.088183 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表