Salt Cloud 命令行完全指南:用 profile 与 map 在云上批量编排虚拟机
2026/9/23 1:22:44 网站建设 项目流程
  • 运维
  • 配置管理
  • 后端

【免费下载链接】salt

Software to automate the management and configuration of infrastructure and applications at scale.

项目地址:https://gitcode.com/gh_mirrors/sa/salt
点击查看免费下载

Salt Cloud 是 Salt 项目中用于在各类公有云上批量开通(provision)虚拟机的子系统,它通过"profile(配置文件)"与"map(映射文件)"两套干净的声明式体系,把多云环境下的建机、查询、销毁等操作统一收敛到salt-cloud这一个命令之下。本文以官方 CLI 参考文档 doc/ref/cli/salt-cloud.rst 为主体,结合仓库中 conf/cloud、conf/cloud.profiles、conf/cloud.maps.d/cloud.map 等配置样例与 salt/cloud/cli.py 源码实现,完整讲解salt-cloud的全部命令行参数、典型用法和底层执行逻辑。读完本文,你将能够独立完成"按 profile 建机、按 map 批量建机、查询云端节点、执行 provider 特有动作、安全销毁实例"的完整实操闭环。

命令概览与核心概念

salt-cloud的设计目标很明确:用一种统一的命令行界面,屏蔽不同云厂商(AWS/EC2、Rackspace/OpenStack、DigitalOcean、Linode 等)之间的 API 差异。它的两条核心操作抽象是:

  • Profile(配置文件):描述"一台虚拟机长什么样",包括 provider、镜像(image)、规格(size)、部署脚本(script)等。定义于cloud.profiles文件或cloud.profiles.d/目录。
  • Map(映射文件):描述"一次要开哪些机器",即把若干名字映射到某个 profile 下。定义于cloud.map文件或cloud.maps.d/目录(默认约定位于/etc/salt/cloud.maps.d/,见 conf/cloud.maps.d/cloud.map 顶部注释)。

官方 Synopsis 给出了命令的基础形态:

salt-cloud -m /etc/salt/cloud.map # 按 map 文件建全部机器 salt-cloud -m /etc/salt/cloud.map NAME # 按 map 文件只建 NAME salt-cloud -m /etc/salt/cloud.map NAME1 NAME2 # 按 map 文件建 NAME1、NAME2 salt-cloud -p PROFILE NAME # 按 profile 建一台 NAME salt-cloud -p PROFILE NAME1 NAME2 NAME3 NAME4 NAME5 NAME6 # 按 profile 批量建多台

从源码结构看,salt-cloud的执行入口在 salt/cloud/cli.py 的SaltCloud.run()方法中:CLI 解析完成并做用户权限校验(要求以 salt-master 同用户或 root 运行)后,会构造salt.cloud.Map映射器,随后根据命令行选项分派到run_profilerun_mapquerydestroydo_function等具体路径。整个流程还会把命令行、cloud主配置、cloud.profiles配置合并到同一个 opts 字典中(见 salt/cloud/cli.py 的模块注释)。

通用选项:所有 salt-* 命令的公共底座

salt-cloud通过.. include::机制复用了 CLI 文档集中的公共选项(对应 doc/ref/cli/_includes/common-options.rst):

选项说明
--version打印当前运行的 Salt 版本
--versions-report显示程序依赖与版本号后退出
-h, --help显示帮助信息并退出
-c CONFIG_DIR, --config-dir=CONFIG_DIR指定 Salt 配置目录,默认大多数系统为/etc/salt,该目录下包含 master、minion 与 cloud 相关配置

执行选项:建机、销毁与动作

执行类选项控制 salt-cloud 真正"动手"做什么,是日常使用频率最高的一组参数。

-L LOCATION, --location=LOCATION

指定要连接的 region/区域。例如针对 AWS 可传us-east-1之类的区域标识;具体取值取决于对应云 driver 的实现(avail_locations可列出可用区域)。

-a ACTION, --action=ACTION

对已存在的实例执行云厂商特有动作(如 reboot、start、stop 等)。该参数必须附带一个或多个实例名

在 salt/cloud/cli.py 中,-a的分支会先收集实例名,并把形如key=value的附加参数解析为 kwargs,然后调用mapper.do_action(names, kwargs)执行动作:

salt-cloud -a reboot myvm1 myvm2 salt-cloud -a stop keypairname=mykey myvm1 # 附带的 key=value 会作为动作参数

注意命令行里形如name=value的参数不会被当作机器名,而是被解析为动作的关键字参数(见 salt/cloud/cli.py)。

-f <FUNC-NAME> <PROVIDER>, --function=<FUNC-NAME> <PROVIDER>

执行一个不针对具体实例的、云厂商特有的函数(如列出镜像、创建 keypair 等)。该参数要求显式指定 provider(例如nova)。对应源码中的mapper.do_function(provider, function_name, kwargs)调用,函数参数同样必须以key=value形式传入,否则会报错提示:

salt-cloud -f show_image my-ec2-config image=ami-54cf5c3d

源码 salt/cloud/cli.py 会扫描所有剩余参数,将含=的解析进 kwargs,并强制要求所有函数参数都以 kwargs 形式传递。

-p PROFILE, --profile=PROFILE

从指定的 profiles 文件中选取单个 profile来创建命名云主机。profile 必须已在 profiles 文件中定义。这是最直接的"按模板开一台机器"的方式:

salt-cloud -p fedora_rackspace web1 web2 db1 db2

上述命令会用fedora_rackspace这个 profile 同时创建 4 台机器。对应源码调用链为mapper.run_profile(profile, names),最终由Map.run_profile -> Map.create -> CloudClient.create逐台完成创建与 salt-bootstrap 部署。

-m MAP, --map=MAP

指定要使用的map 文件。单独使用(不带其他选项)时,会确保 map 文件中声明的所有 VM 都被创建;若同名 VM 已存在则自动跳过。这是批量编排的核心入口:

salt-cloud -m /path/to/cloud.map salt-cloud -m /path/to/cloud.map -P # 并行创建

在 salt/cloud/cli.py 中,map 分支会先调用mapper.map_data()生成执行计划(dmap),计划包含三类结果:errors(profile 配置错误)、existing(已存在将跳过的机器)、create(待创建的机器),必要时还有destroy(配合-d/-H时)。执行前会把待建/待删清单打印出来请求确认(除非加了-y)。

仓库中的示例 map 文件 conf/cloud.maps.d/cloud.map 展示了其格式——顶层键为 profile 名,值为该 profile 下的主机名列表:

fedora_rs: - fedora1 - fedora2 - fedora3 - fedora4 - fedora5 ubuntu_rs: - ubuntu1 - ubuntu2 - ubuntu3 - ubuntu4 - ubuntu5

-H, --hard

配合 map 文件使用的危险选项。默认行为是"确保 map 中所有机器存在";加上-H后,凡是存在于已配置云 provider 上、但未出现在 map 文件中的 VM 都会被销毁。文档明确警告"这是破坏性操作,务必谨慎使用":

salt-cloud -m /path/to/cloud.map -H # 删除 map 中未列出的所有 VM

-d, --destroy

传入一个或多个 VM 名称,salt-cloud 会在已配置的云 provider 中搜索这些名称并销毁对应机器。破坏性操作,需谨慎。可以与-m连用,表示按 map 删除一批机器:

salt-cloud -d myvm1 myvm2 # 销毁指定机器 salt-cloud -m /path/to/cloud.map -d # 销毁 map 中列出的所有机器

源码中-d分支要求-d与(names 或 map)二者取一配合使用,且不允许同时提供 map 文件与实例名(否则直接报错),随后调用mapper.delete_map()(针对 map)或mapper.get_running_by_names()(针对名字)找出匹配机器,打印待销毁清单并请求确认(见 salt/cloud/cli.py)。

-P, --parallel

默认批量建机会串行执行;-P会让每台云 VM 的创建运行在独立进程中,从而一次性并发构建大批机器:

salt-cloud -m /path/to/cloud.map -P

文档特别提示:部分云厂商的系统似乎并不适合这种创建洪峰,大批量建机时要密切盯紧云厂商侧的状态。源码层面对应Map.create_multiprocessing/enter_mainloop等并发基础设施(见 salt/cloud/init.py 中create_multiprocessingdestroy_multiprocessing等函数定义)。

-u, --update-bootstrap

salt-bootstrap 更新到最新的稳定版。该选项在 salt/cloud/cli.py 中会优先处理:调用salt.utils.cloud.update_bootstrap()后直接输出结果并退出。salt-bootstrap 即用于在新机器上部署 salt-minion 的引导脚本,仓库中的各类部署脚本位于 salt/cloud/deploy/(如Ubuntu.shFedora.shbootstrap-salt.sh等),更新 bootstrap 即更新这些引导脚本的来源。

-y, --assume-yes

对所有确认问题默认回答 yes,实现无人值守执行。对应源码print_confirm()中的判断——若assume_yes为真则直接放行,否则打印清单并交互式等待输入Proceed? [N/y](见 salt/cloud/cli.py)。

-k, --keep-tmp

deploy.sh执行完成后不清理 /tmp/ 下的临时文件,便于排查部署脚本问题。

--show-deploy-args

在返回的数据中包含部署 minion 时使用的选项,用于审计/调试。

--script-args=SCRIPT_ARGS

以空格分隔的字符串形式,向 bootstrap 脚本传递自定义脚本参数,用于定制化部署:

salt-cloud -p myprofile myvm --script-args="git vim"

查询选项:掌握云端节点状态

查询类选项不创建也不销毁任何资源,只读取并展示云厂商返回的节点信息,适合做盘点与巡检。

-Q, --query

对已配置的云 provider 执行一次查询,返回正在运行的节点信息(精简列表):

salt-cloud -Q

-F, --full-query

执行查询并打印所有云 VM 的全部可用信息。可与-m连用,仅展示指定 map 内机器的信息:

salt-cloud -F salt-cloud -m /path/to/cloud.map -F

-S, --select-query

执行查询并打印经过筛选的节点信息(比-Q详细、比-F精简)。同样可与-m连用:

salt-cloud -S salt-cloud -m /path/to/cloud.map -S

查询选项在 salt/cloud/cli.py 中统一分派:selected_query_option对应-Q/-F/-S,有 map 时走mapper.interpolated_map(query=...),否则走mapper.map_providers_parallel(query=...)Map类中的queryfull_queryselect_querymin_query方法则分别映射到云 driver 的list_nodeslist_nodes_fulllist_nodes_selectlist_nodes_min(参见 salt/cloud/init.py 与 salt/cloud/libcloudfuncs.py 中同名函数)。注意官方在 CLI 中展示-Q/-F/-S与 map 的搭配示例:

salt-cloud -m /path/to/cloud.map -Q # 显示 map 中所有 VM 的状态

--list-providers

列出所有已配置的 provider。对应源码mapper.provider_list()

--list-profiles

列出所有已配置的 profiles(该选项自 2014.7.0 版本加入)。可以传入具体云厂商(如digitalocean)查看该厂商关联的 profile,也可以传all列出全部:

salt-cloud --list-profiles salt-cloud --list-profiles digitalocean salt-cloud --list-profiles all

云资源清单查询:locations / images / sizes

这三个选项用于预览云厂商可用的资源目录,是编写 profile 前调研环境的必备工具。它们的共同用法是:传入具体 provider 名(如linodeAWS),或传all查询所有已配置 provider。

salt-cloud --list-locations=linode # 列出 linode 可用区域 salt-cloud --list-locations=all # 列出所有 provider 的可用区域 salt-cloud --list-images=linode # 列出 linode 可用镜像 salt-cloud --list-images=all salt-cloud --list-sizes=AWS # 列出 AWS 可用规格 salt-cloud --list-sizes=all

在源码中分别对应Maplocation_listimage_listsize_list方法(salt/cloud/init.py),最终落到 libcloud 层的avail_locationsavail_imagesavail_sizes(见 salt/cloud/libcloudfuncs.py)。这些查询信息正是写 profile 时locationimagesize三个字段取值的重要来源。

云凭据管理:--set-password

salt-cloud --set-password=<USERNAME> <PROVIDER>

为云 provider 配置密码并保存到系统的 keyring(密钥环)中PROVIDER可以只写厂商名,也可以写成"厂商:驱动"的精确形式:

salt-cloud --set-password bob rackspace # 模糊指定 salt-cloud --set-password bob rackspace:openstack # 精确到驱动

官方文档明确标注该选项DEPRECATED!(已弃用)。从源码看,其实现将凭据名称规范化为salt.cloud.provider.<PROVIDER>后调用salt.utils.cloud.store_password_in_keyring()写入 keyring(见 salt/cloud/cli.py)。由于已弃用,新环境建议直接通过 cloud provider 配置文件中的password字段等方式管理凭据。

输出选项:控制返回数据的呈现

salt-cloud通过 include 机制复用了输出选项(见 doc/ref/cli/_includes/output-options.rst),其中与多云场景最相关的有:

选项说明
--out OUTPUTTER指定输出器,可选highstatejsonkeypprintrawtxtyaml等;输出器不支持该数据时会自动回退到pprint
--out-indent N按 N 个空格缩进输出(负值禁用缩进),仅对支持缩进的输出器生效
--out-file=FILE将输出写入指定文件
--out-file-append以追加方式写入输出文件
--no-color/--force-color禁用/强制彩色输出。彩色含义:绿色=成功,红色=失败,蓝色=变更与成功,黄色=预期将发生的配置变更
--state-output=MODE覆盖 minion 的 state_output 配置,可选fulltersemixedchangesfilter,并支持_id_color后缀(如full_id_color
--state-verbose=True/False覆盖 state_verbose 配置

在多云脚本化场景中,--out=json --out-file=/tmp/cloud.json这类组合非常适合把查询/建机结果喂给上层自动化系统。

完整实战:从 profile 到批量建机

将以上参数串联起来,一个典型的 salt-cloud 使用流程如下。

第 1 步:配置 provider 凭据。cloud.providerscloud.providers.d/中声明云厂商连接信息(仓库样例见 conf/cloud.providers.d/,如ec2.conflinode.confdigitalocean.conf等)。

第 2 步:定义 profile。在 conf/cloud.profiles 或cloud.profiles.d/中定义机器模板。仓库样例揭示了核心字段:

base_ec2: provider: my-ec2-config image: ami-e565ba8c size: t1.micro script: python-bootstrap minion: cheese: edam

其中provider指向 providers 文件中定义的连接别名,imagesize可用上文--list-images/--list-sizes查询,script指定使用 salt/cloud/deploy/ 下的部署脚本(如python-bootstrapUbuntuFedora),minion下的键值会写入新机器的 minion 配置。

第 3 步:按 profile 单建或批量建机。

salt-cloud -p fedora_rackspace web1 web2 db1 db2

第 4 步:用 map 做幂等批量编排。在 map 文件中声明"要保证存在"的机器集合(见 conf/cloud.maps.d/cloud.map),然后:

salt-cloud -m /path/to/cloud.map # 确保 map 内机器全部存在 salt-cloud -m /path/to/cloud.map -P # 并行创建 salt-cloud -m /path/to/cloud.map -Q # 查看 map 内机器状态 salt-cloud -m /path/to/cloud.map -d # 销毁 map 内机器 salt-cloud -m /path/to/cloud.map -H # 销毁 map 外机器(危险!)

第 5 步:状态查询与清理。-Q/-F/-S盘点云上资产,用-d-a执行销毁与实例级动作。所有破坏性操作执行前,print_confirm()都会打印待操作清单并要求输入y确认(除非加了-y),这是防止误操作的关键防线(见 salt/cloud/cli.py)。

执行模型与注意事项

从 salt/cloud/cli.py 源码可以梳理出 salt-cloud 的执行模型:

  • 权限要求:若运行在 master 机器上,必须以 salt-master 同用户身份运行;否则需对配置目录有写权限(否则启动即报错退出)。
  • 配置合并:CLI 参数、cloud主配置、master 配置(用于 master 集成)、cloud.profiles配置四路数据合并为一个 opts,profiles 最终挂在opts['profiles']下。
  • map 执行计划map_data()生成errors/existing/create/destroy四类结果,已存在机器自动跳过,配置错误会先行展示。
  • 并发-P通过多进程方式并发建机/销毁;默认串行以降低对云厂商 API 的压力。

另外,仓库的 conf/cloud 主配置文件中还提供了keysize(minion 密钥位数,默认 2048)、script(默认部署脚本)、log_leveldelete_sshkeysenable_cloud_grains等全局默认值,这些都会影响salt-cloud的整体行为,是调优建机流程的切入点。

关联参考

  • 命令详细帮助:salt-cloud --help;在线版本见 doc/ref/cli/salt-cloud.rst
  • 云模块参考:Salt Cloud 相关的通用功能文档 doc/ref/cli/
  • 相关命令手册:salt(7)salt-master(1)salt-minion(1)见 doc/ref/cli/
  • 源码实现:salt/cloud/cli.py(CLI 入口与参数分派)、salt/cloud/init.py(Map/CloudClient 核心逻辑)、salt/cloud/libcloudfuncs.py(libcloud 驱动通用层)
  • 配置样例:conf/cloud(主配置)、conf/cloud.profiles(profile 示例)、conf/cloud.maps.d/cloud.map(map 示例)、conf/cloud.providers.d/(provider 示例)
  • 运维
  • 配置管理
  • 后端

【免费下载链接】salt

Software to automate the management and configuration of infrastructure and applications at scale.

项目地址:https://gitcode.com/gh_mirrors/sa/salt
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询