gushiren

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://cloudinit.readthedocs.io/en/latest/topics/examples.html
介绍:
    cloud-init是专为云环境中虚拟机的初始化而开发的工具,它从各种数据源读取相关数据并据此对虚拟机进行配置。
    向一台数据服务器获取元数据(meta data)和用户数据(user data),前者是指VM的必要信息,
    如主机名、网络地址等;后者是系统或用户需要的数据和文件,如用户组信息、启动脚本等。
    当cloud-init获取这些信息后,开始使用一些模块对数据进行处理,如新建用户、启动脚本等。常见的配置包括:设定虚拟机的hostname、hosts文件、设定用户名密码、更新apt -get的本地缓存、调整文件系统的大小(注意不是调整分区的大小)等。
工作原理:
    首先,数据服务器开启HTTP服务,cloud-init会向数据服务器发送请求,确认数据源模块,依次获取版本、数据类型和具体数据内容信息。
    
    功能:
    用户可配置性
        可以通过用户数据配置Cloud-init的行为。
        用户数据可以给用户在实例启动时输出
        例如,这可以通过--user-data或--user-data-file参数到ec2-run-instances
        
    特征
    设置默认域
    设置一个实例的主机名
    生成实例SSH秘钥
    将SSH密钥添加到用户的.ssh / authorized_keys,以便他们可以登录
    设置临时挂载点
    配置网络设备

可用性:
    它目前安装在Ubuntu Cloud Images中,还有在EC2,Azure,GCE和许多其他云端上提供的官方Ubuntu映像。
    支持诸多linux发行版本,ubuntu、fedora、debian、rhel、centos等等

Gzip压缩:
    发现gzip压缩的内容将被解压缩。 然后将使用未压缩的数据,如同未压缩的数据一样。 
    这通常是有用的,因为用户数据被限制在〜16384 [1]个字节。

用户数据:
    配置文件(Cloud Config Data),类型为Content-Type: text/cloud-config,系统配置文件,如管理用户等,与/etc/cloud下的cloud.cfg最后合并配置项
    启动任务(Upstart Job),类型为Content-Type: text/upstart-job,建立Upstart的服务
    用户数据脚本(User-Data Script),类型为Content-Type: text/x-shellscript,用户自定义的脚本,在启动时执行
    包含文件(Include File),类型为Content-Type: text/x-include-url,该文件内容是一个链接,这个链接的内容是一个文件, (Cloud Boothook),类型为Content-Type: text/cloud-boothook
    压缩内容( Gzip Compressed Content),
    处理句柄(Part Handler),类型为Content-Type: text/part-handler,内容为python脚本,根据用户数据文件的类型做相应的处理
    多部分存档(Mime Multi Part archive),当客户端需要下载多个上述用户数据文件时,可用Mime编码为Mime Multi Part archive一次下载

目录结构:
启动阶段:
    
    Generator
    Local
    Network
    Config
    Final
当在systemd下引导时,将运行一个生成器,以确定cloud-init.target是否应包含在引导目标中。
默认情况下,此生成器将启用cloud-init。 它不会启用cloud-init,如果:
    
    Generator:
        当在systemd下引导时,将运行一个生成器,以确定cloud-init.target是否应包含在引导目标中。 
        默认情况下,此生成器将启用cloud-init。 它不会启用cloud-init,如果:A file exists: /etc/cloud/cloud-init.disabled
         /proc/cmdline contains cloud-init=disabled
    
    local:
        cloud-init-local.service
        找到本地的数据源
        对系统应用及网络进行配置
        网络配置:
            数据源
            网卡dhcp
            禁用网络
    
    Network:
        cloud-init.service
        http
        解压gzip
        格式化磁盘、分区
        bootcmd
    
    Config:
        cloud-config.service
        配置模块modules
    Final:
        cloud-final.service
        启动最后阶段rc.local
        包的安装
        配置管理插件、chef、puppet
        用户脚本,runcmd

数据源:
    数据源是cloud-init的配置数据源,通常来自用户(也称为用户数据)或来自创建配置驱动器(也称为元数据)的堆栈。
    型的用户数据将包括文件,yaml和shell脚本,而典型的元数据将包括服务器名称,实例ID,
    显示名称和其他云具体细节。 
    由于有多种方式来提供这些数据(每个云解决方案似乎都喜欢自己的方式)内部创建了一个数据源抽象类,
    以允许单一方式访问不同的云系统方法,以通过典型的子类使用提供此数据。
    
    支持的方式:
        Alt Cloud:
            RHEVm
            vSphere
        Azure
        CloudSigma
        CloudStack
        Config Drive
        Digital Ocean
        Amazon EC2
        MAAS
        NoCloud
        OpenNebula
        OVF
        SmartOS Datasource
        OpenStack:
            metadata_urls http://169.254.169.254返回200ok
            max_wait default 1
            timeout default 10
            retries default 5重试次数
        #cloud-config
            datasource:
                OpenStack:
                metadata_urls: ["http://169.254.169.254"]
                max_wait: -1
                timeout: 10
                retries: 5
Logging:
    支持本地和远程日志记录是通过 python 的内置-在日志记录配置并通过云 init rsyslog 模块可配置、
    默认cloud-init将其输出配置从/etc/cloud/cloud.cfg.d/05_logging.cfg加载
    默认配置将stdout和stderr从所有cloud-init阶段引导到/var/log/cloud-init-output.log

Modules:
    Apt Configure配置ubuntu 源列表
    Bootcmd:在引导过程的早期运行命令,用于在引导过程中不能完成的
    Byobu:该模块控制是否启用或禁用系统范围以及默认系统用户
    CA Certs:添加CA证书
    Chef:安装chef client
    Debug:帮助调试内部数据结构
    Disable EC2 Metadata:默认禁用,该模块通过拒绝发送到169.254.169.254的路由,从而禁用ec2数据源。
    Disk Setup:配置分区和文件系统
    Emit Upstart:发出启动配置,不需要配置
    Fan:配置ubuntu网络
    Final Message:当cloud-init完成时输出最终消息
        version: cloud-init version版本
        timestamp: time at cloud-init finish 完成耗时
        datasource: cloud-init data source源数据
        uptime: system uptime系统运行时间
    Foo:示例显示模块结构,不做任何事情    
    Growpart:调整分区大小以填充可用磁盘空间
        growpart:
            mode: auto
            devices: ["/"]
            ignore_growroot_disabled: false
    Grub Dpkg:配置哪个设备用作grub安装的目标,默认情况下,此模块应正常工作无须配置。
    Keys to Console:控制哪些ssh密钥可以写入控制台
        出于安全考虑,可能不希望将ssh指纹和密钥写入控制台。 
        为了避免将ssh键的类型指纹写入控制台,可以使用ssh_fp_console_blacklist配置密钥。 
        默认情况下,所有类型的键都将其指纹写入控制台。 
        为了避免将密钥类型的密钥写入控制台,可以使用ssh_key_console_blacklist配置密钥。
        默认情况下,ssh-dss键不会写入控制台
    Landscape:
    Locale:配置系统区域设置并系统应用
    LXD:
    Mcollective:
    Migrator:该模块处理将旧版本的cloud-init数据移动到较新版本
    Mounts:配置挂载点和交换文件
    NTP:处理ntp配置
        ntp:
    pools:
        - 0.company.pool.ntp.org
        - 1.company.pool.ntp.org
        - ntp.myorg.org
    servers:
        - my.ntp.server.local
        - ntp.ubuntu.com
        - 192.168.23.2
    Package Update Upgrade Install:
        更新,升级和安装软件包
    此模块允许在引导期间更新,升级或安装软件包
     如果要安装任何软件包或执行升级,那么软件包缓存将首先更新。 
     如果软件包安装或升级需要重新启动,则如果指定了package_reboot_if_required,则可以执行重新启动。 
     可以提供要安装的软件包的列表。 
     列表中的每个条目可以是包名称或具有两个条目的列表,第一个是包名称,第二个是要安装的特定包版本。
    Phone Home:
        引导完成后,该模块可用于将数据发布到远程主机, 可以发布所有数据或发布的密钥列表。
    Power State Change:
        改变电源状态
        所有配置模块都运行后,该模块处理关机/重新启动。
    Puppet:
        安装、配置puppet
    Resizefs:调;整文件系统的大小以使用分区上的所有可用空间。
    Resolv Conf:
        manage_resolv_conf: <true/false>
    resolv_conf:
        nameservers: ['8.8.4.4', '8.8.8.8']
        searchdomains:
            - foo.example.com
            - bar.example.com
        domain: example.com
        options:
            rotate: <true/false>
            timeout: 1
        Debian / Ubuntu默认情况下会使用resovlconf,同样的RedHat也会使用sysconfig
    RedHat Subscription:
        通过用户名和密码或激活和组织注册一个RedHat系统
    Rsyslog:
        此模块使用rsyslog配置远程系统日志记录
    Runcmd:
        在类似级别的rc.local上运行任意命令,并输出到控制台
        所有的命令必须是正确的yaml,因此您必须引用yaml所符合的任何字符
        runcmd:
    - [ ls, -l, / ]
    - [ sh, -xc, "echo $(date) ': hello world!'" ]
    - [ sh, -c, echo "=========hello world'=========" ]
    - ls -l /root
    - [ wget, "http://example.org", -O, /tmp/index.html ]
    如果项目是一个列表,它将被正确执行,就好像传递给execve()(以第一个arg为命令)。 
    如果项目是一个字符串,它将被写入一个文件并使用sh进行解释
    Salt Minion:配置公钥和私钥
    Scripts Per Boot:运行启动脚本
        数据源中的scripts / per-boot目录中的任何脚本都将在系统引导时运行。
    Scripts Per Instance:实例运行脚本,系统引导时运行
    Scripts Per Once:运行一次脚本
    Scripts User:运行用户脚本
        该模块运行所有用户脚本。 
        用户脚本未在数据源中的scripts目录中指定,而是存在于实例配置中的脚本目录中。
    Scripts Vendor:数据源中脚本/供应商目录中的任何脚本将在首次引导新实例时运行。
    Seed Random:生成随机秘钥
    Set Hostname:设置主机名和fqdn
    Set Passwords:设置系统密码,启用或禁用ssh密码认证。
        chpasswd配置密钥接受一个包含两个密钥中的一个的字典,即过期或列表。 
        如果expire被指定并设置为false,那么将使用password全局配置密钥作为所有用户帐户的密码。 
        如果指定了过期密钥,并设置为true,则用户密码将过期,从而防止使用默认系统密码。
        ssh_pwauth: <yes/no/unchanged>

        password: password1
        chpasswd:
        expire: <true/false>

        chpasswd:
        list: |
            user1:password1
            user2:RANDOM
            user3:password3
            user4:R

        ##
        # or as yaml list
        ##
        chpasswd:
            list:
            - user1:password1
            - user2:RANDOM
            - user3:password3
            - user4:R
            - user4:$6$rL..$ej...
    SSH:该模块处理ssh和ssh密钥的大部分配置
    SSH Authkey Fingerprints:为每个用户写入授权密钥的指纹记录日志
    SSH Import Id:此模块通过公钥钥匙服务器(通常是启动板或github)使用ssh-import-id导入ssh密钥
    Timezone:设置系统时区
        timezone: <timezone>
    Update Etc Hosts:更新/etc/hosts
        该模块将根据config中指定的主机名/ fqdn更新/ etc / hosts的内容。 
        / etc / hosts的管理使用manage_etc_hosts进行控制。 
        如果设置为false,则cloud-init将不会管理/ etc / hosts
        如果设置为true或template,cloud-init将使用位于/etc/cloud/templates/hosts.tmpl中的模板生成/ etc / hosts。 
        如果manage_etc_hosts设置为localhost,那么cloud-init将不会完全重写/ etc / hosts,而是确保/ etc / hosts中存在具有ip 127.0.1.1的fqdn的条目
        manage_etc_hosts: <true/"template"/false/"localhost">
        fqdn: <fqdn>
        hostname: <fqdn/hostname>
    Update Hostname:该模块将更新系统主机名和fqdn。
        preserve_hostname: <true/false>
        fqdn: <fqdn>
        hostname: <fqdn/hostname>
    Users and Groups:配置用户和组
            groups:
    - <group>: [<user>, <user>]
    - <group>

    users:
        - default
        - name: <username>
        expiredate: <date>
        gecos: <comment>
        groups: <additional groups>
        homedir: <home directory>
        inactive: <true/false>
        lock_passwd: <true/false>
        no-create-home: <true/false>
        no-log-init: <true/false>
        no-user-group: <true/false>
        passwd: <password>
        primary-group: <primary group>
        selinux-user: <selinux username>
        shell: <shell path>
        snapuser: <email>
        ssh-authorized-keys:
            - <key>
            - <key>
        ssh-import-id: <id>
        sudo: <sudo config>
        system: <true/false>
        uid: <user id>
    Write Files:
        将任意内容写入文件,可选择设置权限。 内容可以用纯文本或二进制格式指定。 
        可以指定使用base64或二进制gzip数据编码的数据,并在写入之前对其进行解码。
            write_files:
        - encoding: b64
        content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4...
        owner: root:root
        path: /etc/sysconfig/selinux
        permissions: '0644'
        - content: |
        # My new /etc/sysconfig/samba file

        SMDBOPTIONS="-D"
        path: /etc/sysconfig/samba
        - content: !!binary |
        f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAwARAAAAAAABAAAAAAAAAAJAVAAAAAA
        AEAAHgAdAAYAAAAFAAAAQAAAAAAAAABAAEAAAAAAAEAAQAAAAAAAwAEAAAAAAA
        AAAAAAAAAwAAAAQAAAAAAgAAAAAAAAACQAAAAAAAAAJAAAAAAAAcAAAAAAAAAB
        ...
        path: /bin/arch
        permissions: '0555'
    Yum Add Repo:
        将yum存储库配置添加到/etc/yum.repos.d。
        yum_repos:
            <repo-name>:
                baseurl: <repo url>
                name: <repo name>
                enabled: <true/false>

posted on 2018-08-21 14:40  gushiren  阅读(27460)  评论(0编辑  收藏  举报