All cloud config examples

Note

This page is a summary containing all the cloud config YAML examples together. If you would like to explore examples by operation or process instead, refer to the examples library.

Including users and groups

 1#cloud-config  2# Add groups to the system  3# The following example adds the 'admingroup' group with members 'root' and 'sys'  4# and the empty group cloud-users.  5groups:  6 - admingroup: [root,sys]  7 - cloud-users  8  9# Add users to the system. Users are added after groups are added.  10# Note: Most of these configuration options will not be honored if the user  11# already exists. Following options are the exceptions and they are  12# applicable on already-existing users:  13# - 'plain_text_passwd', 'hashed_passwd', 'lock_passwd', 'sudo',  14# 'ssh_authorized_keys', 'ssh_redirect_user'.  15users:  16 - default  17 - name: foobar  18 gecos: Foo B. Bar  19 primary_group: foobar  20 groups: users  21 selinux_user: staff_u  22 expiredate: '2032-09-01'  23 ssh_import_id:  24 - lp:falcojr  25 - gh:TheRealFalcon  26 lock_passwd: false  27 passwd: $6$j212wezy$7H/1LT4f9/N3wpgNunhsIqtMj62OKiS3nyNwuizouQc3u7MbYCarYeAHWYPYb2FT.lbioDm2RrkJPb9BZMN1O/  28 - name: barfoo  29 gecos: Bar B. Foo  30 sudo: "ALL=(ALL) NOPASSWD:ALL"  31 groups: users, admin  32 ssh_import_id:  33 - lp:falcojr  34 - gh:TheRealFalcon  35 lock_passwd: true  36 ssh_authorized_keys:  37 - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSL7uWGj8cgWyIOaspgKdVy0cKJ+UTjfv7jBOjG2H/GN8bJVXy72XAvnhM0dUM+CCs8FOf0YlPX+Frvz2hKInrmRhZVwRSL129PasD12MlI3l44u6IwS1o/W86Q+tkQYEljtqDOo0a+cOsaZkvUNzUyEXUwz/lmYa6G4hMKZH4NBj7nbAAF96wsMCoyNwbWryBnDYUr6wMbjRR1J9Pw7Xh7WRC73wy4Va2YuOgbD3V/5ZrFPLbWZW/7TFXVrql04QVbyei4aiFR5n//GvoqwQDNe58LmbzX/xvxyKJYdny2zXmdAhMxbrpFQsfpkJ9E/H5w0yOdSvnWbUoG5xNGoOB csmith@fringe  38 - name: testuser  39 gecos: Mr. Test  40 homedir: /local/testdir  41 sudo: ["ALL=(ALL) NOPASSWD:ALL"]  42 - name: cloudy  43 gecos: Magic Cloud App Daemon User  44 inactive: '5'  45 system: true  46 - name: fizzbuzz  47 shell: /bin/bash  48 ssh_authorized_keys:  49 - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSL7uWGj8cgWyIOaspgKdVy0cKJ+UTjfv7jBOjG2H/GN8bJVXy72XAvnhM0dUM+CCs8FOf0YlPX+Frvz2hKInrmRhZVwRSL129PasD12MlI3l44u6IwS1o/W86Q+tkQYEljtqDOo0a+cOsaZkvUNzUyEXUwz/lmYa6G4hMKZH4NBj7nbAAF96wsMCoyNwbWryBnDYUr6wMbjRR1J9Pw7Xh7WRC73wy4Va2YuOgbD3V/5ZrFPLbWZW/7TFXVrql04QVbyei4aiFR5n//GvoqwQDNe58LmbzX/xvxyKJYdny2zXmdAhMxbrpFQsfpkJ9E/H5w0yOdSvnWbUoG5xNGoOB csmith@fringe  50 - snapuser: joe@joeuser.io  51 - name: nosshlogins  52 ssh_redirect_user: true  53  54# Valid Values:  55# name: The user's login name  56# expiredate: Date on which the user's account will be disabled.  57# gecos: The user name's real name, i.e. "Bob B. Smith"  58# homedir: Optional. Set to the local path you want to use. Defaults to  59# /home/<username>  60# primary_group: define the primary group. Defaults to a new group created  61# named after the user.  62# groups: Optional. Additional groups to add the user to. Defaults to none  63# selinux_user: Optional. The SELinux user for the user's login, such as  64# "staff_u". When this is omitted the system will select the default  65# SELinux user.  66# lock_passwd: Defaults to true. Lock the password to disable password login  67# inactive: Number of days after password expires until account is disabled  68# passwd: The hash -- not the password itself -- of the password you want  69# to use for this user. You can generate a hash via:  70# mkpasswd --method=SHA-512 --rounds=4096  71# (the above command would create from stdin an SHA-512 password hash  72# with 4096 salt rounds)  73#  74# Please note: while the use of a hashed password is better than  75# plain text, the use of this feature is not ideal. Also,  76# using a high number of salting rounds will help, but it should  77# not be relied upon.  78#  79# To highlight this risk, running John the Ripper against the  80# example hash above, with a readily available wordlist, revealed  81# the true password in 12 seconds on a i7-2620QM.  82#  83# In other words, this feature is a potential security risk and is  84# provided for your convenience only. If you do not fully trust the  85# medium over which your cloud-config will be transmitted, then you  86# should not use this feature.  87#  88# no_create_home: When set to true, do not create home directory.  89# no_user_group: When set to true, do not create a group named after the user.  90# no_log_init: When set to true, do not initialize lastlog and faillog database.  91# ssh_import_id: Optional. Import SSH ids  92# ssh_authorized_keys: Optional. [list] Add keys to user's authorized keys file  93# An error will be raised if no_create_home or system is  94# also set.  95# ssh_redirect_user: Optional. [bool] Set true to block ssh logins for cloud  96# ssh public keys and emit a message redirecting logins to  97# use <default_username> instead. This option only disables cloud  98# provided public-keys. An error will be raised if ssh_authorized_keys  99# or ssh_import_id is provided for the same user. 100# 101# sudo: Defaults to none. Accepts a sudo rule string, a list of sudo rule 102# strings or False to explicitly deny sudo usage. Examples: 103# 104# Allow a user unrestricted sudo access. 105# sudo: "ALL=(ALL) NOPASSWD:ALL" 106# or 107# sudo: ["ALL=(ALL) NOPASSWD:ALL"] 108# 109# Adding multiple sudo rule strings. 110# sudo: 111# - "ALL=(ALL) NOPASSWD:/bin/mysql" 112# - "ALL=(ALL) ALL" 113# 114# Note: Please double check your syntax and make sure it is valid. 115# cloud-init does not parse/check the syntax of the sudo 116# directive. 117# system: Create the user as a system user. This means no home directory. 118# snapuser: Create a Snappy (Ubuntu-Core) user via the snap create-user 119# command available on Ubuntu systems. If the user has an account 120# on the Ubuntu SSO, specifying the email will allow snap to 121# request a username and any public ssh keys and will import 122# these into the system with username specified by SSO account. 123# If 'username' is not set in SSO, then username will be the 124# shortname before the email domain. 125# 126 127# Default user creation: 128# 129# Unless you define users, you will get a 'ubuntu' user on Ubuntu systems with the 130# legacy permission (no password sudo, locked user, etc). If however, you want 131# to have the 'ubuntu' user in addition to other users, you need to instruct 132# cloud-init that you also want the default user. To do this use the following 133# syntax: 134# users: 135# - default 136# - bob 137# - .... 138# foobar: ... 139# 140# users[0] (the first user in users) overrides the user directive. 141# 142# The 'default' user above references the distro's config set in 143# /etc/cloud/cloud.cfg. 

Writing out arbitrary files

 1#cloud-config  2# vim: syntax=yaml  3#  4# This is the configuration syntax that the write_files module  5# will know how to understand. Encoding can be given b64 or gzip or (gz+b64).  6# The content will be decoded accordingly and then written to the path that is  7# provided.   8#  9# Note: Content strings here are truncated for example purposes. 10write_files: 11- encoding: b64 12 content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4... 13 owner: root:root 14 path: /etc/sysconfig/selinux 15 permissions: '0644' 16- content: | 17 # My new /etc/sysconfig/samba file 18 19 SMBDOPTIONS="-D" 20 path: /etc/sysconfig/samba 21- content: !!binary | 22 f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAwARAAAAAAABAAAAAAAAAAJAVAAAAAAAAAAAAAEAAOAAI 23 AEAAHgAdAAYAAAAFAAAAQAAAAAAAAABAAEAAAAAAAEAAQAAAAAAAwAEAAAAAAADAAQAAAAAAAAgA 24 AAAAAAAAAwAAAAQAAAAAAgAAAAAAAAACQAAAAAAAAAJAAAAAAAAcAAAAAAAAABwAAAAAAAAAAQAA 25 .... 26 path: /bin/arch 27 permissions: '0555' 28- encoding: gzip 29 content: !!binary | 30 H4sIAIDb/U8C/1NW1E/KzNMvzuBKTc7IV8hIzcnJVyjPL8pJ4QIA6N+MVxsAAAA= 31 path: /usr/bin/hello 32 permissions: '0755' 

Adding a yum repository

 1#cloud-config  2# vim: syntax=yaml  3#  4# Add yum repository configuration to the system  5#  6# The following example adds the file /etc/yum.repos.d/epel_testing.repo  7# which can then subsequently be used by yum for later operations.  8yum_repos:  9 # The name of the repository 10 epel-testing: 11 # Any repository configuration options 12 # See: man yum.conf 13 # 14 # At least one of 'baseurl' or 'metalink' or 'mirrorlist' is required! 15 baseurl: http://download.fedoraproject.org/pub/epel/testing/5/$basearch 16 metalink: https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir 17 mirrorlist: https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever& 18 enabled: false 19 failovermethod: priority 20 gpgcheck: true 21 gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL 22 name: Extra Packages for Enterprise Linux 5 - Testing 

Configure an instance’s trusted CA certificates

 1#cloud-config  2#  3# This is an example file to configure an instance's trusted CA certificates  4# system-wide for SSL/TLS trust establishment when the instance boots for the  5# first time.  6#  7# Make sure that this file is valid yaml before starting instances.  8# It should be passed as user-data when starting the instance.  9 10ca_certs: 11 # If present and set to True, the 'remove_defaults' parameter will either 12 # disable all the trusted CA certifications normally shipped with 13 # Alpine, Debian or Ubuntu. On RedHat, this action will delete those 14 # certificates. 15 # This is mainly for very security-sensitive use cases - most users will not 16 # need this functionality. 17 remove_defaults: true 18 19 # If present, the 'trusted' parameter should contain a certificate (or list 20 # of certificates) to add to the system as trusted CA certificates. 21 # Pay close attention to the YAML multiline list syntax. The example shown 22 # here is for a list of multiline certificates. 23 trusted:  24 - | 25 -----BEGIN CERTIFICATE----- 26 YOUR-ORGS-TRUSTED-CA-CERT-HERE 27 -----END CERTIFICATE----- 28 - | 29 -----BEGIN CERTIFICATE----- 30 YOUR-ORGS-TRUSTED-CA-CERT-HERE 31 -----END CERTIFICATE----- 

Install and run chef recipes

 1#cloud-config  2#  3# This is an example file to automatically install chef-client and run a  4# list of recipes when the instance boots for the first time.  5# Make sure that this file is valid yaml before starting instances.  6# It should be passed as user-data when starting the instance.  7  8# The default is to install from packages.  9  10# Key from https://packages.chef.io/chef.asc  11apt:  12 sources:  13 source1:  14 source: "deb http://packages.chef.io/repos/apt/stable $RELEASE main"  15 key: |  16 -----BEGIN PGP PUBLIC KEY BLOCK-----  17 Version: GnuPG v1.4.12 (Darwin)  18 Comment: GPGTools - http://gpgtools.org  19  20 mQGiBEppC7QRBADfsOkZU6KZK+YmKw4wev5mjKJEkVGlus+NxW8wItX5sGa6kdUu  21 twAyj7Yr92rF+ICFEP3gGU6+lGo0Nve7KxkN/1W7/m3G4zuk+ccIKmjp8KS3qn99  22 dxy64vcji9jIllVa+XXOGIp0G8GEaj7mbkixL/bMeGfdMlv8Gf2XPpp9vwCgn/GC  23 JKacfnw7MpLKUHOYSlb//JsEAJqao3ViNfav83jJKEkD8cf59Y8xKia5OpZqTK5W  24 ShVnNWS3U5IVQk10ZDH97Qn/YrK387H4CyhLE9mxPXs/ul18ioiaars/q2MEKU2I  25 XKfV21eMLO9LYd6Ny/Kqj8o5WQK2J6+NAhSwvthZcIEphcFignIuobP+B5wNFQpe  26 DbKfA/0WvN2OwFeWRcmmd3Hz7nHTpcnSF+4QX6yHRF/5BgxkG6IqBIACQbzPn6Hm  27 sMtm/SVf11izmDqSsQptCrOZILfLX/mE+YOl+CwWSHhl+YsFts1WOuh1EhQD26aO  28 Z84HuHV5HFRWjDLw9LriltBVQcXbpfSrRP5bdr7Wh8vhqJTPjrQnT3BzY29kZSBQ  29 YWNrYWdlcyA8cGFja2FnZXNAb3BzY29kZS5jb20+iGAEExECACAFAkppC7QCGwMG  30 CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRApQKupg++Caj8sAKCOXmdG36gWji/K  31 +o+XtBfvdMnFYQCfTCEWxRy2BnzLoBBFCjDSK6sJqCu0IENIRUYgUGFja2FnZXMg  32 PHBhY2thZ2VzQGNoZWYuaW8+iGIEExECACIFAlQwYFECGwMGCwkIBwMCBhUIAgkK  33 CwQWAgMBAh4BAheAAAoJEClAq6mD74JqX94An26z99XOHWpLN8ahzm7cp13t4Xid  34 AJ9wVcgoUBzvgg91lKfv/34cmemZn7kCDQRKaQu0EAgAg7ZLCVGVTmLqBM6njZEd  35 Zbv+mZbvwLBSomdiqddE6u3eH0X3GuwaQfQWHUVG2yedyDMiG+EMtCdEeeRebTCz  36 SNXQ8Xvi22hRPoEsBSwWLZI8/XNg0n0f1+GEr+mOKO0BxDB2DG7DA0nnEISxwFkK  37 OFJFebR3fRsrWjj0KjDxkhse2ddU/jVz1BY7Nf8toZmwpBmdozETMOTx3LJy1HZ/  38 Te9FJXJMUaB2lRyluv15MVWCKQJro4MQG/7QGcIfrIZNfAGJ32DDSjV7/YO+IpRY  39 IL4CUBQ65suY4gYUG4jhRH6u7H1p99sdwsg5OIpBe/v2Vbc/tbwAB+eJJAp89Zeu  40 twADBQf/ZcGoPhTGFuzbkcNRSIz+boaeWPoSxK2DyfScyCAuG41CY9+g0HIw9Sq8  41 DuxQvJ+vrEJjNvNE3EAEdKl/zkXMZDb1EXjGwDi845TxEMhhD1dDw2qpHqnJ2mtE  42 WpZ7juGwA3sGhi6FapO04tIGacCfNNHmlRGipyq5ZiKIRq9mLEndlECr8cwaKgkS  43 0wWu+xmMZe7N5/t/TK19HXNh4tVacv0F3fYK54GUjt2FjCQV75USnmNY4KPTYLXA  44 dzC364hEMlXpN21siIFgB04w+TXn5UF3B4FfAy5hevvr4DtV4MvMiGLu0oWjpaLC  45 MpmrR3Ny2wkmO0h+vgri9uIP06ODWIhJBBgRAgAJBQJKaQu0AhsMAAoJEClAq6mD  46 74Jq4hIAoJ5KrYS8kCwj26SAGzglwggpvt3CAJ0bekyky56vNqoegB+y4PQVDv4K  47 zA==  48 =IxPr  49 -----END PGP PUBLIC KEY BLOCK-----  50  51chef:  52  53 # Valid values are 'accept' and 'accept-no-persist'  54 chef_license: "accept"  55  56 # Valid values are 'gems' and 'packages' and 'omnibus'  57 install_type: "packages"  58  59 # Boolean: run 'install_type' code even if chef-client  60 # appears already installed.  61 force_install: false  62  63 # Chef settings  64 server_url: "https://chef.yourorg.com"  65  66 # Node Name  67 # Defaults to the instance-id if not present  68 node_name: "your-node-name"  69  70 # Environment  71 # Defaults to '_default' if not present  72 environment: "production"  73  74 # Default validation name is chef-validator  75 validation_name: "yourorg-validator"  76 # if validation_cert's value is "system" then it is expected  77 # that the file already exists on the system.  78 validation_cert: |  79 -----BEGIN RSA PRIVATE KEY-----  80 YOUR-ORGS-VALIDATION-KEY-HERE  81 -----END RSA PRIVATE KEY-----  82  83 # A run list for a first boot json, an example (not required)  84 run_list:  85 - "recipe[apache2]"  86 - "role[db]"  87  88 # Specify a list of initial attributes used by the cookbooks  89 initial_attributes:  90 apache:  91 prefork:  92 maxclients: 100  93 keepalive: "off"  94  95 # if install_type is 'omnibus', change the url to download  96 omnibus_url: "https://www.chef.io/chef/install.sh"  97  98 # if install_type is 'omnibus', pass pinned version string  99 # to the install script 100 omnibus_version: "12.3.0" 101 102 # If encrypted data bags are used, the client needs to have a secrets file 103 # configured to decrypt them 104 encrypted_data_bag_secret: "/etc/chef/encrypted_data_bag_secret" 

Install and run ansible-pull

 1#cloud-config  2package_update: true  3package_upgrade: true  4  5# if you're already installing other packages, you may  6# wish to manually install ansible to avoid multiple calls  7# to your package manager  8packages:  9 - git 10ansible: 11 install_method: pip 12 pull: 13 - url: "https://github.com/holmanb/vmboot.git" 14 playbook_names: [ubuntu.yml] 

Configure instance to be managed by Ansible

 1#cloud-config  2#  3# A common use-case for cloud-init is to bootstrap user and ssh  4# settings to be managed by a remote configuration management tool,  5# such as ansible.  6#  7# This example assumes a default Ubuntu cloud image, which should contain  8# the required software to be managed remotely by Ansible.  9# 10ssh_pwauth: false 11 12users: 13- name: ansible 14 gecos: Ansible User 15 groups: users,admin,wheel 16 sudo: "ALL=(ALL) NOPASSWD:ALL" 17 shell: /bin/bash 18 lock_passwd: true 19 ssh_authorized_keys: 20 - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRCJCQ1UD9QslWDSw5Pwsvba0Wsf1pO4how5BtNaZn0xLZpTq2nqFEJshUkd/zCWF7DWyhmNphQ8c+U+wcmdNVcg2pI1kPxq0VZzBfZ7cDwhjgeLsIvTXvU+HVRtsXh4c5FlUXpRjf/x+a3vqFRvNsRd1DE+5ZqQHbOVbnsStk3PZppaByMg+AZZMx56OUk2pZCgvpCwj6LIixqwuxNKPxmJf45RyOsPUXwCwkq9UD4me5jksTPPkt3oeUWw1ZSSF8F/141moWsGxSnd5NxCbPUWGoRfYcHc865E70nN4WrZkM7RFI/s5mvQtuj8dRL67JUEwvdvEDO0EBz21FV/iOracXd2omlTUSK+wYrWGtiwQwEgr4r5bimxDKy9L8UlaJZ+ONhLTP8ecTHYkaU1C75sLX9ZYd5YtqjiNGsNF+wdW6WrXrQiWeyrGK7ZwbA7lagSxIa7yeqnKDjdkcJvQXCYGLM9AMBKWeJaOpwqZ+dOunMDLd5VZrDCU2lpCSJ1M=" 21 22 23# use the following passwordless demonstration key for testing or 24# replace with your own key pair 25# 26# -----BEGIN OPENSSH PRIVATE KEY----- 27# b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn 28# NhAAAAAwEAAQAAAYEA0QiQkNVA/ULJVg0sOT8LL22tFrH9aTuIaMOQbTWmZ9MS2aU6tp6h 29# RCbIVJHf8wlhew1soZjaYUPHPlPsHJnTVXINqSNZD8atFWcwX2e3A8IY4Hi7CL0171Ph1U 30# bbF4eHORZVF6UY3/8fmt76hUbzbEXdQxPuWakB2zlW57ErZNz2aaWgcjIPgGWTMeejlJNq 31# WQoL6QsI+iyIsasLsTSj8ZiX+OUcjrD1F8AsJKvVA+JnuY5LEzz5Ld6HlFsNWUkhfBf9eN 32# ZqFrBsUp3eTcQmz1FhqEX2HB3POuRO9JzeFq2ZDO0RSP7OZr0Lbo/HUS+uyVBML3bxAztB 33# Ac9tRVf4jq2nF3dqJpU1EivsGK1hrYsEMBIK+K+W4psQysvS/FJWiWfjjYS0z/HnEx2JGl 34# NQu+bC1/WWHeWLao4jRrDRfsHVulq160Ilnsqxiu2cGwO5WoEsSGu8nqpyg43ZHCb0FwmB 35# izPQDASlniWjqcKmfnTrpzAy3eVWawwlNpaQkidTAAAFgGKSj8diko/HAAAAB3NzaC1yc2 36# EAAAGBANEIkJDVQP1CyVYNLDk/Cy9trRax/Wk7iGjDkG01pmfTEtmlOraeoUQmyFSR3/MJ 37# YXsNbKGY2mFDxz5T7ByZ01VyDakjWQ/GrRVnMF9ntwPCGOB4uwi9Ne9T4dVG2xeHhzkWVR 38# elGN//H5re+oVG82xF3UMT7lmpAds5VuexK2Tc9mmloHIyD4BlkzHno5STalkKC+kLCPos 39# iLGrC7E0o/GYl/jlHI6w9RfALCSr1QPiZ7mOSxM8+S3eh5RbDVlJIXwX/XjWahawbFKd3k 40# 3EJs9RYahF9hwdzzrkTvSc3hatmQztEUj+zma9C26Px1EvrslQTC928QM7QQHPbUVX+I6t 41# pxd3aiaVNRIr7BitYa2LBDASCvivluKbEMrL0vxSVoln442EtM/x5xMdiRpTULvmwtf1lh 42# 3li2qOI0aw0X7B1bpatetCJZ7KsYrtnBsDuVqBLEhrvJ6qcoON2Rwm9BcJgYsz0AwEpZ4l 43# o6nCpn5066cwMt3lVmsMJTaWkJInUwAAAAMBAAEAAAGAEuz77Hu9EEZyujLOdTnAW9afRv 44# XDOZA6pS7yWEufjw5CSlMLwisR83yww09t1QWyvhRqEyYmvOBecsXgaSUtnYfftWz44apy 45# /gQYvMVELGKaJAC/q7vjMpGyrxUPkyLMhckALU2KYgV+/rj/j6pBMeVlchmk3pikYrffUX 46# JDY990WVO194Dm0buLRzJvfMKYF2BcfF4TvarjOXWAxSuR8www050oJ8HdKahW7Cm5S0po 47# FRnNXFGMnLA62vN00vJW8V7j7vui9ukBbhjRWaJuY5rdG/UYmzAe4wvdIEnpk9xIn6JGCp 48# FRYTRn7lTh5+/QlQ6FXRP8Ir1vXZFnhKzl0K8Vqh2sf4M79MsIUGAqGxg9xdhjIa5dmgp8 49# N18IEDoNEVKUbKuKe/Z5yf8Z9tmexfH1YttjmXMOojBvUHIjRS5hdI9NxnPGRLY2kjAzcm 50# gV9Rv3vtdF/+zalk3fAVLeK8hXK+di/7XTvYpfJ2EZBWiNrTeagfNNGiYydsQy3zjZAAAA 51# wBNRak7UrqnIHMZn7pkCTgceb1MfByaFtlNzd+Obah54HYIQj5WdZTBAITReMZNt9S5NAR 52# M8sQB8UoZPaVSC3ppILIOfLhs6KYj6RrGdiYwyIhMPJ5kRWF8xGCLUX5CjwH2EOq7XhIWt 53# MwEFtd/gF2Du7HUNFPsZGnzJ3e7pDKDnE7w2khZ8CIpTFgD769uBYGAtk45QYTDo5JroVM 54# ZPDq08Gb/RhIgJLmIpMwyreVpLLLe8SwoMJJ+rihmnJZxO8gAAAMEA0lhiKezeTshht4xu 55# rWc0NxxD84a29gSGfTphDPOrlKSEYbkSXhjqCsAZHd8S8kMr3iF6poOk3IWSvFJ6mbd3ie 56# qdRTgXH9Thwk4KgpjUhNsQuYRHBbI59Mo+BxSI1B1qzmJSGdmCBL54wwzZmFKDQPQKPxiL 57# n0Mlc7GooiDMjT1tbuW/O1EL5EqTRqwgWPTKhBA6r4PnGF150hZRIMooZkD2zX6b1sGojk 58# QpvKkEykTwnKCzF5TXO8+wJ3qbcEo9AAAAwQD+Z0r68c2YMNpsmyj3ZKtZNPSvJNcLmyD/ 59# lWoNJq3djJN4s2JbK8l5ARUdW3xSFEDI9yx/wpfsXoaqWnygP3PoFw2CM4i0EiJiyvrLFU 60# r3JLfDUFRy3EJ24RsqbigmEsgQOzTl3xfzeFPfxFoOhokSvTG88PQji1AYHz5kA7p6Zfaz 61# Ok11rJYIe7+e9B0lhku0AFwGyqlWQmS/MhIpnjHIk5tP4heHGSmzKQWJDbTskNWd6aq1G7 62# 6HWfDpX4HgoM8AAAALaG9sbWFuYkBhcmM= 63# -----END OPENSSH PRIVATE KEY----- 64# 

Configure instance to be an Ansible controller

 1#cloud-config  2#  3# Demonstrate setting up an ansible controller host on boot.  4# This example installs a playbook repository from a remote private repository  5# and then runs two of the plays.  6  7package_update: true  8package_upgrade: true  9packages:  10 - git  11 - python3-pip  12  13# Set up an ansible user  14# ----------------------  15# In this case I give the local ansible user passwordless sudo so that ansible  16# may write to a local root-only file.  17users:  18- name: ansible  19 gecos: Ansible User  20 shell: /bin/bash  21 groups: users,admin,wheel,lxd  22 sudo: "ALL=(ALL) NOPASSWD:ALL"  23  24# Initialize lxd using cloud-init.  25# --------------------------------  26# In this example, a lxd container is  27# started using ansible on boot, so having lxd initialized is required.  28lxd:  29 init:  30 storage_backend: dir  31  32# Configure and run ansible on boot  33# ---------------------------------  34# Install ansible using pip, ensure that community.general collection is  35# installed [1].  36# Use a deploy key to clone a remote private repository then run two playbooks.  37# The first playbook starts a lxd container and creates a new inventory file.  38# The second playbook connects to and configures the container using ansible.  39# The public version of the playbooks can be inspected here [2]  40#  41# [1] community.general is likely already installed by pip  42# [2] https://github.com/holmanb/ansible-lxd-public  43#  44ansible:  45 install_method: pip  46 package_name: ansible  47 run_user: ansible  48 galaxy:  49 actions:  50 - ["ansible-galaxy", "collection", "install", "community.general"]  51  52 setup_controller:  53 repositories:  54 - path: /home/ansible/my-repo/  55 source: git@github.com:holmanb/ansible-lxd-private.git  56 run_ansible:  57 - playbook_dir: /home/ansible/my-repo  58 playbook_name: start-lxd.yml  59 timeout: 120  60 forks: 1  61 private_key: /home/ansible/.ssh/id_rsa  62 - playbook_dir: /home/ansible/my-repo  63 playbook_name: configure-lxd.yml  64 become_user: ansible  65 timeout: 120  66 forks: 1  67 private_key: /home/ansible/.ssh/id_rsa  68 inventory: new_ansible_hosts  69  70# Write a deploy key to the filesystem for ansible.  71# -------------------------------------------------  72# This deploy key is tied to a private github repository [1]  73# This key exists to demonstrate deploy key usage in ansible  74# a duplicate public copy of the repository exists here[2]  75#  76# [1] https://github.com/holmanb/ansible-lxd-private  77# [2] https://github.com/holmanb/ansible-lxd-public  78#  79write_files:  80 - path: /home/ansible/.ssh/known_hosts  81 owner: ansible:ansible  82 permissions: 0o600  83 defer: true  84 content: |  85 |1|YJEFAk6JjnXpUjUSLFiBQS55W9E=|OLNePOn3eBa1PWhBBmt5kXsbGM4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl  86 |1|PGGnpCpqi0aakERS4BWnYxMkMwM=|Td0piZoS4ZVC0OzeuRwKcH1MusM= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==  87 |1|OJ89KrsNcFTOvoCP/fPGKpyUYFo=|cu7mNzF+QB/5kR0spiYmUJL7DAI= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=  88  89 - path: /home/ansible/.ssh/id_rsa  90 owner: ansible:ansible  91 permissions: 0o600  92 defer: true  93 encoding: base64  94 content: |  95 LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFB  96 QUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUJsd0FBQUFkemMyZ3RjbgpOaEFBQUFB  97 d0VBQVFBQUFZRUEwUWlRa05WQS9VTEpWZzBzT1Q4TEwyMnRGckg5YVR1SWFNT1FiVFdtWjlNUzJh  98 VTZ0cDZoClJDYklWSkhmOHdsaGV3MXNvWmphWVVQSFBsUHNISm5UVlhJTnFTTlpEOGF0Rldjd1gy  99 ZTNBOElZNEhpN0NMMDE3MVBoMVUKYmJGNGVIT1JaVkY2VVkzLzhmbXQ3NmhVYnpiRVhkUXhQdVdh 100 a0IyemxXNTdFclpOejJhYVdnY2pJUGdHV1RNZWVqbEpOcQpXUW9MNlFzSStpeUlzYXNMc1RTajha 101 aVgrT1VjanJEMUY4QXNKS3ZWQStKbnVZNUxFeno1TGQ2SGxGc05XVWtoZkJmOWVOClpxRnJCc1Vw 102 M2VUY1FtejFGaHFFWDJIQjNQT3VSTzlKemVGcTJaRE8wUlNQN09acjBMYm8vSFVTK3V5VkJNTDNi 103 eEF6dEIKQWM5dFJWZjRqcTJuRjNkcUpwVTFFaXZzR0sxaHJZc0VNQklLK0srVzRwc1F5c3ZTL0ZK 104 V2lXZmpqWVMwei9IbkV4MkpHbApOUXUrYkMxL1dXSGVXTGFvNGpSckRSZnNIVnVscTE2MElsbnNx 105 eGl1MmNHd081V29Fc1NHdThucXB5ZzQzWkhDYjBGd21CCml6UFFEQVNsbmlXanFjS21mblRycHpB 106 eTNlVldhd3dsTnBhUWtpZFRBQUFGZ0dLU2o4ZGlrby9IQUFBQUIzTnphQzF5YzIKRUFBQUdCQU5F 107 SWtKRFZRUDFDeVZZTkxEay9DeTl0clJheC9XazdpR2pEa0cwMXBtZlRFdG1sT3JhZW9VUW15RlNS 108 My9NSgpZWHNOYktHWTJtRkR4ejVUN0J5WjAxVnlEYWtqV1EvR3JSVm5NRjludHdQQ0dPQjR1d2k5 109 TmU5VDRkVkcyeGVIaHprV1ZSCmVsR04vL0g1cmUrb1ZHODJ4RjNVTVQ3bG1wQWRzNVZ1ZXhLMlRj 110 OW1tbG9ISXlENEJsa3pIbm81U1RhbGtLQytrTENQb3MKaUxHckM3RTBvL0dZbC9qbEhJNnc5UmZB 111 TENTcjFRUGlaN21PU3hNOCtTM2VoNVJiRFZsSklYd1gvWGpXYWhhd2JGS2QzawozRUpzOVJZYWhG 112 OWh3ZHp6cmtUdlNjM2hhdG1RenRFVWorem1hOUMyNlB4MUV2cnNsUVRDOTI4UU03UVFIUGJVVlgr 113 STZ0CnB4ZDNhaWFWTlJJcjdCaXRZYTJMQkRBU0N2aXZsdUtiRU1yTDB2eFNWb2xuNDQyRXRNL3g1 114 eE1kaVJwVFVMdm13dGYxbGgKM2xpMnFPSTBhdzBYN0IxYnBhdGV0Q0paN0tzWXJ0bkJzRHVWcUJM 115 RWhydko2cWNvT04yUndtOUJjSmdZc3owQXdFcFo0bApvNm5DcG41MDY2Y3dNdDNsVm1zTUpUYVdr 116 SkluVXdBQUFBTUJBQUVBQUFHQUV1ejc3SHU5RUVaeXVqTE9kVG5BVzlhZlJ2ClhET1pBNnBTN3lX 117 RXVmanc1Q1NsTUx3aXNSODN5d3cwOXQxUVd5dmhScUV5WW12T0JlY3NYZ2FTVXRuWWZmdFd6NDRh 118 cHkKL2dRWXZNVkVMR0thSkFDL3E3dmpNcEd5cnhVUGt5TE1oY2tBTFUyS1lnVisvcmovajZwQk1l 119 VmxjaG1rM3Bpa1lyZmZVWApKRFk5OTBXVk8xOTREbTBidUxSekp2Zk1LWUYyQmNmRjRUdmFyak9Y 120 V0F4U3VSOHd3dzA1MG9KOEhkS2FoVzdDbTVTMHBvCkZSbk5YRkdNbkxBNjJ2TjAwdkpXOFY3ajd2 121 dWk5dWtCYmhqUldhSnVZNXJkRy9VWW16QWU0d3ZkSUVucGs5eEluNkpHQ3AKRlJZVFJuN2xUaDUr 122 L1FsUTZGWFJQOElyMXZYWkZuaEt6bDBLOFZxaDJzZjRNNzlNc0lVR0FxR3hnOXhkaGpJYTVkbWdw 123 OApOMThJRURvTkVWS1ViS3VLZS9aNXlmOFo5dG1leGZIMVl0dGptWE1Pb2pCdlVISWpSUzVoZEk5 124 TnhuUEdSTFkya2pBemNtCmdWOVJ2M3Z0ZEYvK3phbGszZkFWTGVLOGhYSytkaS83WFR2WXBmSjJF 125 WkJXaU5yVGVhZ2ZOTkdpWXlkc1F5M3pqWkFBQUEKd0JOUmFrN1VycW5JSE1abjdwa0NUZ2NlYjFN 126 ZkJ5YUZ0bE56ZCtPYmFoNTRIWUlRajVXZFpUQkFJVFJlTVpOdDlTNU5BUgpNOHNRQjhVb1pQYVZT 127 QzNwcElMSU9mTGhzNktZajZSckdkaVl3eUloTVBKNWtSV0Y4eEdDTFVYNUNqd0gyRU9xN1hoSVd0 128 Ck13RUZ0ZC9nRjJEdTdIVU5GUHNaR256SjNlN3BES0RuRTd3MmtoWjhDSXBURmdENzY5dUJZR0F0 129 azQ1UVlURG81SnJvVk0KWlBEcTA4R2IvUmhJZ0pMbUlwTXd5cmVWcExMTGU4U3dvTUpKK3JpaG1u 130 Slp4TzhnQUFBTUVBMGxoaUtlemVUc2hodDR4dQpyV2MwTnh4RDg0YTI5Z1NHZlRwaERQT3JsS1NF 131 WWJrU1hoanFDc0FaSGQ4UzhrTXIzaUY2cG9PazNJV1N2Rko2bWJkM2llCnFkUlRnWEg5VGh3azRL 132 Z3BqVWhOc1F1WVJIQmJJNTlNbytCeFNJMUIxcXptSlNHZG1DQkw1NHd3elptRktEUVBRS1B4aUwK 133 bjBNbGM3R29vaURNalQxdGJ1Vy9PMUVMNUVxVFJxd2dXUFRLaEJBNnI0UG5HRjE1MGhaUklNb29a 134 a0Qyelg2YjFzR29qawpRcHZLa0V5a1R3bktDekY1VFhPOCt3SjNxYmNFbzlBQUFBd1FEK1owcjY4 135 YzJZTU5wc215ajNaS3RaTlBTdkpOY0xteUQvCmxXb05KcTNkakpONHMySmJLOGw1QVJVZFczeFNG 136 RURJOXl4L3dwZnNYb2FxV255Z1AzUG9GdzJDTTRpMEVpSml5dnJMRlUKcjNKTGZEVUZSeTNFSjI0 137 UnNxYmlnbUVzZ1FPelRsM3hmemVGUGZ4Rm9PaG9rU3ZURzg4UFFqaTFBWUh6NWtBN3A2WmZhegpP 138 azExckpZSWU3K2U5QjBsaGt1MEFGd0d5cWxXUW1TL01oSXBuakhJazV0UDRoZUhHU216S1FXSkRi 139 VHNrTldkNmFxMUc3CjZIV2ZEcFg0SGdvTThBQUFBTGFHOXNiV0Z1WWtCaGNtTT0KLS0tLS1FTkQg 140 T1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCg== 

Add primary apt repositories

 1#cloud-config  2  3# Add primary apt repositories  4#  5# To add 3rd party repositories, see cloud-config-apt.txt or the  6# Additional apt configuration and repositories section.  7#  8#  9# Default: auto select based on instance-data 10# in ec2, the default is <region>.archive.ubuntu.com 11# apt: 12# primary: 13# - arches: [default] 14# uri: 15# use the provided mirror 16# search: 17# search the list for the first mirror. 18# this is currently very limited, only verifying that 19# the mirror is dns resolvable or an IP address 20# 21# if neither mirror is set (the default) 22# then use the mirror provided by the DataSource found. 23# In EC2, that means using <region>.ec2.archive.ubuntu.com 24# 25# if no mirror is provided by the DataSource, but 'search_dns' is 26# true, then search for dns names '<distro>-mirror' in each of 27# - fqdn of this host per meta-data 28# - localdomain 29# - no domain (which would search domains listed in /etc/resolv.conf) 30# If there is a dns entry for <distro>-mirror, then it is assumed that there 31# is a distro mirror at http://<distro>-mirror.<domain>/<distro> 32# 33# That gives the cloud provider the opportunity to set mirrors of a distro 34# up and expose them only by creating dns entries. 35# 36# if none of that is found, then the default distro mirror is used 37apt: 38 primary: 39 - arches: [default] 40 uri: http://us.archive.ubuntu.com/ubuntu/ 41# or 42apt: 43 primary: 44 - arches: [default] 45 search: 46 - http://local-mirror.mydomain 47 - http://archive.ubuntu.com 48# or 49apt: 50 primary: 51 - arches: [default] 52 search_dns: True 

Run commands on first boot

 1#cloud-config  2  3# boot commands  4# default: none  5# This is very similar to runcmd, but commands run very early  6# in the boot process, only slightly after a 'boothook' would run.  7# - bootcmd will run on every boot  8# - 'cloud-init-per' command can be used to make bootcmd run exactly once  9bootcmd: 10 - echo 192.168.1.130 us.archive.ubuntu.com >> /etc/hosts 11 - [ cloud-init-per, once, mymkfs, mkfs, /dev/vdb ] 
 1#cloud-config  2  3# run commands  4# default: none  5# runcmd contains a list of either lists or a string  6# each item will be executed in order at rc.local like level with  7# output to the console  8# - runcmd only runs during the first boot  9# - if the item is a list, the items will be properly executed as if 10# passed to execve(3) (with the first arg as the command). 11# - if the item is a string, it will be simply written to the file and 12# will be interpreted by 'sh' 13# 14# Note, that the list has to be proper yaml, so you have to quote 15# any characters yaml would eat (':' can be problematic) 16runcmd: 17 - [ ls, -l, / ] 18 - [ sh, -xc, "echo $(date) ': hello world!'" ] 19 - [ sh, -c, echo "=========hello world=========" ] 20 - ls -l /root 21 # Note: Don't write files to /tmp from cloud-init use /run/somedir instead. 22 # Early boot environments can race systemd-tmpfiles-clean LP: #1707222. 23 - mkdir /run/mydir 24 - [ wget, "http://slashdot.org", -O, /run/mydir/index.html ] 

Run commands on very early at every boot

1#cloud-boothook 2#!/bin/sh 3echo 192.168.1.130 us.archive.ubuntu.com > /etc/hosts 

Install arbitrary packages

 1#cloud-config  2  3# Install additional packages on first boot  4#  5# Default: none  6#  7# if packages are specified, then package_update will be set to true  8#  9# packages may be supplied as a single package name or as a list 10# with the format [<package>, <version>] wherein the specific 11# package version will be installed. 12packages: 13 - pwgen 14 - pastebinit 15 - [libpython2.7, 2.7.3-0ubuntu3.1] 

Update apt database on first boot

1#cloud-config 2# Update apt database on first boot (run 'apt-get update'). 3# Note, if packages are given, or package_upgrade is true, then 4# update will be done independent of this setting. 5# 6# Default: false 7package_update: true 

Run apt or yum upgrade

1#cloud-config 2 3# Upgrade the instance on first boot 4# 5# Default: false 6package_upgrade: true 

Adjust mount points mounted

 1#cloud-config  2  3# set up mount points  4# 'mounts' contains a list of lists  5# the inner list are entries for an /etc/fstab line  6# ie : [ fs_spec, fs_file, fs_vfstype, fs_mntops, fs_freq, fs_passno ]  7#  8# default:  9# mounts: 10# - [ ephemeral0, /mnt ] 11# - [ swap, none, swap, sw, 0, 0 ] 12# 13# in order to remove a previously listed mount (ie, one from defaults) 14# list only the fs_spec. For example, to override the default, of 15# mounting swap: 16# - [ swap ] 17# or 18# - [ swap, null ] 19# 20# - if a device does not exist at the time, an entry will still be 21# written to /etc/fstab. 22# - '/dev' can be omitted for device names that begin with: xvd, sd, hd, vd 23# - if an entry does not have all 6 fields, they will be filled in 24# with values from 'mount_default_fields' below. 25# 26# Note, that you should set 'nofail' (see man fstab) for volumes that may not 27# be attached at instance boot (or reboot). 28# 29mounts: 30 - [ ephemeral0, /mnt, auto, "defaults,noexec" ] 31 - [ sdc, /opt/data ] 32 - [ xvdh, /opt/data, "auto", "defaults,nofail", "0", "0" ] 33 - [ dd, /dev/zero ] 34 35# mount_default_fields 36# These values are used to fill in any entries in 'mounts' that are not 37# complete. This must be an array, and must have 6 fields. 38mount_default_fields: [ None, None, "auto", "defaults,nofail", "0", "2" ] 39 40 41# swap can also be set up by the 'mounts' module 42# default is to not create any swap files, because 'size' is set to 0 43swap: 44 filename: /swap.img 45 size: "auto" # or size in bytes 46 maxsize: 10485760 # size in bytes 

Configure instance’s SSH keys

 1#cloud-config  2  3# add each entry to ~/.ssh/authorized_keys for the configured user or the  4# first user defined in the user definition directive.  5ssh_authorized_keys:  6 - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEA3FSyQwBI6Z+nCSjUUk8EEAnnkhXlukKoUPND/RRClWz2s5TCzIkd3Ou5+Cyz71X0XmazM3l5WgeErvtIwQMyT1KjNoMhoJMrJnWqQPOt5Q8zWd9qG7PBl9+eiH5qV7NZ mykey@host  7 - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3I7VUf2l5gSn5uavROsc5HRDpZdQueUq5ozemNSj8T7enqKHOEaFoU2VoPgGEWC9RyzSQVeyD6s7APMcE82EtmW4skVEgEGSbDc1pvxzxtchBj78hJP6Cf5TCMFSXw+Fz5rF1dR23QDbN1mkHs7adr8GW4kSWqU7Q7NDwfIrJJtO7Hi42GyXtvEONHbiRPOe8stqUly7MvUoN+5kfjBM8Qqpfl2+FNhTYWpMfYdPUnE7u536WqzFmsaqJctz3gBxH9Ex7dFtrxR4qiqEr9Qtlu3xGn7Bw07/+i1D+ey3ONkZLN+LQ714cgj8fRS4Hj29SCmXp5Kt5/82cD/VN3NtHw== smoser@brickies  8  9# Send pre-generated SSH private keys to the server 10# If these are present, they will be written to /etc/ssh and 11# new random keys will not be generated 12# in addition to 'rsa' as shown below, 'ecdsa' is also supported 13ssh_keys: 14 rsa_private: | 15 -----BEGIN RSA PRIVATE KEY----- 16 MIIBxwIBAAJhAKD0YSHy73nUgysO13XsJmd4fHiFyQ+00R7VVu2iV9Qcon2LZS/x 17 1cydPZ4pQpfjEha6WxZ6o8ci/Ea/w0n+0HGPwaxlEG2Z9inNtj3pgFrYcRztfECb 18 1j6HCibZbAzYtwIBIwJgO8h72WjcmvcpZ8OvHSvTwAguO2TkR6mPgHsgSaKy6GJo 19 PUJnaZRWuba/HX0KGyhz19nPzLpzG5f0fYahlMJAyc13FV7K6kMBPXTRR6FxgHEg 20 L0MPC7cdqAwOVNcPY6A7AjEA1bNaIjOzFN2sfZX0j7OMhQuc4zP7r80zaGc5oy6W 21 p58hRAncFKEvnEq2CeL3vtuZAjEAwNBHpbNsBYTRPCHM7rZuG/iBtwp8Rxhc9I5w 22 ixvzMgi+HpGLWzUIBS+P/XhekIjPAjA285rVmEP+DR255Ls65QbgYhJmTzIXQ2T9 23 luLvcmFBC6l35Uc4gTgg4ALsmXLn71MCMGMpSWspEvuGInayTCL+vEjmNBT+FAdO 24 W7D4zCpI43jRS9U06JVOeSc9CDk2lwiA3wIwCTB/6uc8Cq85D9YqpM10FuHjKpnP 25 REPPOyrAspdeOAV+6VKRavstea7+2DZmSUgE 26 -----END RSA PRIVATE KEY----- 27 28 rsa_public: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEAoPRhIfLvedSDKw7XdewmZ3h8eIXJD7TRHtVW7aJX1ByifYtlL/HVzJ09nilCl+MSFrpbFnqjxyL8Rr/DSf7QcY/BrGUQbZn2Kc22PemAWthxHO18QJvWPocKJtlsDNi3 smoser@localhost 29 30# By default, the fingerprints of the authorized keys for the users 31# cloud-init adds are printed to the console. Setting 32# no_ssh_fingerprints to true suppresses this output. 33no_ssh_fingerprints: false 34 35# By default, (most) ssh host keys are printed to the console. Setting 36# emit_keys_to_console to false suppresses this output. 37ssh: 38 emit_keys_to_console: false 

Additional apt configuration and repositories

 1#cloud-config  2# apt_pipelining (configure Acquire::http::Pipeline-Depth)  3# Default: disables HTTP pipelining. Certain web servers, such  4# as S3 do not pipeline properly (LP: #948461).  5# Valid options:  6# False/default: Disables pipelining for APT  7# None/Unchanged: Use OS default  8# Number: Set pipelining to some number (not recommended)  9apt_pipelining: False  10  11# Install additional packages on first boot  12#  13# Default: none  14#  15# if packages are specified, then package_update will be set to true  16  17packages: ['pastebinit']  18  19apt:  20 # The apt config consists of two major "areas".  21 #  22 # On one hand there is the global configuration for the apt feature.  23 #  24 # On one hand (down in this file) there is the source dictionary which allows  25 # to define various entries to be considered by apt.  26  27 ##############################################################################  28 # Section 1: global apt configuration  29 #  30 # The following examples number the top keys to ease identification in  31 # discussions.  32  33 # 1.1 preserve_sources_list  34 #  35 # Preserves the existing /etc/apt/sources.list  36 # Default: false - do overwrite sources_list. If set to true then any  37 # "mirrors" configuration will have no effect.  38 # Set to true to avoid affecting sources.list. In that case only  39 # "extra" source specifications will be written into  40 # /etc/apt/sources.list.d/*  41 preserve_sources_list: true  42  43 # 1.2 disable_suites  44 #  45 # This is an empty list by default, so nothing is disabled.  46 #  47 # If given, those suites are removed from sources.list after all other  48 # modifications have been made.  49 # Suites are even disabled if no other modification was made,  50 # but not if is preserve_sources_list is active.  51 # There is a special alias "$RELEASE" as in the sources that will be replace  52 # by the matching release.  53 #  54 # To ease configuration and improve readability the following common ubuntu  55 # suites will be automatically mapped to their full definition.  56 # updates => $RELEASE-updates  57 # backports => $RELEASE-backports  58 # security => $RELEASE-security  59 # proposed => $RELEASE-proposed  60 # release => $RELEASE  61 #  62 # There is no harm in specifying a suite to be disabled that is not found in  63 # the source.list file (just a no-op then)  64 #  65 # Note: Lines don't get deleted, but disabled by being converted to a comment.  66 # The following example disables all usual defaults except $RELEASE-security.  67 # On top it disables a custom suite called "mysuite"  68 disable_suites: [$RELEASE-updates, backports, $RELEASE, mysuite]  69  70 # 1.3 primary/security archives  71 #  72 # Default: none - instead it is auto select based on instance-data  73 # so if neither "uri" nor "search", nor "search_dns" is set (the default)  74 # then use the mirror provided by the DataSource found.  75 # In EC2, that means using <region>.ec2.archive.ubuntu.com  76 #  77 # define a custom (e.g. localized) mirror that will be used in sources.list  78 # and any custom sources entries for deb / deb-src lines.  79 #  80 # One can set primary and security mirror to different uri's  81 # the child elements to the keys primary and secondary are equivalent  82 primary:  83 # arches is list of architectures the following config applies to  84 # the special keyword "default" applies to any architecture not explicitly  85 # listed.  86 - arches: [amd64, i386, default]  87 # uri is just defining the target as-is  88 uri: http://us.archive.ubuntu.com/ubuntu  89 #  90 # via search one can define lists that are tried one by one.  91 # The first with a working DNS resolution (or if it is an IP) will be  92 # picked. That way one can keep one configuration for multiple  93 # subenvironments that select the working one.  94 search:  95 - http://cool.but-sometimes-unreachable.com/ubuntu  96 - http://us.archive.ubuntu.com/ubuntu  97 # if no mirror is provided by uri or search but 'search_dns' is  98 # true, then search for dns names '<distro>-mirror' in each of  99 # - fqdn of this host per meta-data 100 # - localdomain 101 # - no domain (which would search domains listed in /etc/resolv.conf) 102 # If there is a dns entry for <distro>-mirror, then it is assumed that 103 # there is a distro mirror at http://<distro>-mirror.<domain>/<distro> 104 # 105 # That gives the cloud provider the opportunity to set mirrors of a distro 106 # up and expose them only by creating dns entries. 107 # 108 # if none of that is found, then the default distro mirror is used 109 search_dns: true 110 # 111 # If multiple of a category are given 112 # 1. uri 113 # 2. search 114 # 3. search_dns 115 # the first defining a valid mirror wins (in the order as defined here, 116 # not the order as listed in the config). 117 # 118 # Additionally, if the repository requires a custom signing key, it can be 119 # specified via the same fields as for custom sources: 120 # 'keyid': providing a key to import via shortid or fingerprint 121 # 'key': providing a raw PGP key 122 # 'keyserver': specify an alternate keyserver to pull keys from that 123 # were specified by keyid 124 - arches: [s390x, arm64] 125 # as above, allowing to have one config for different per arch mirrors 126 # security is optional, if not defined it is set to the same value as primary 127 security: 128 - uri: http://security.ubuntu.com/ubuntu 129 arches: [default] 130 # If search_dns is set for security the searched pattern is: 131 # <distro>-security-mirror 132 133 # if no mirrors are specified at all, or all lookups fail it will try 134 # to get them from the cloud datasource and if those neither provide one fall 135 # back to: 136 # primary: http://archive.ubuntu.com/ubuntu 137 # security: http://security.ubuntu.com/ubuntu 138 139 # 1.4 sources_list 140 # 141 # Provide a custom template for rendering sources.list 142 # without one provided cloud-init uses builtin templates for 143 # ubuntu and debian. 144 # Within these sources.list templates you can use the following replacement 145 # variables (all have sane Ubuntu defaults, but mirrors can be overwritten 146 # as needed (see above)): 147 # => $RELEASE, $MIRROR, $PRIMARY, $SECURITY 148 sources_list: | # written by cloud-init custom template 149 deb $MIRROR $RELEASE main restricted 150 deb-src $MIRROR $RELEASE main restricted 151 deb $PRIMARY $RELEASE universe restricted 152 deb $SECURITY $RELEASE-security multiverse 153 154 # 1.5 conf 155 # 156 # Any apt config string that will be made available to apt 157 # see the APT.CONF(5) man page for details what can be specified 158 conf: | # APT config 159 APT { 160 Get { 161 Assume-Yes "true"; 162 Fix-Broken "true"; 163 }; 164 }; 165 166 # 1.6 (http_|ftp_|https_)proxy 167 # 168 # Proxies are the most common apt.conf option, so that for simplified use 169 # there is a shortcut for those. Those get automatically translated into the 170 # correct Acquire::*::Proxy statements. 171 # 172 # note: proxy actually being a short synonym to http_proxy 173 proxy: http://[[user][:pass]@]host[:port]/ 174 http_proxy: http://[[user][:pass]@]host[:port]/ 175 ftp_proxy: ftp://[[user][:pass]@]host[:port]/ 176 https_proxy: https://[[user][:pass]@]host[:port]/ 177 178 # 1.7 add_apt_repo_match 179 # 180 # 'source' entries in apt-sources that match this python regex 181 # expression will be passed to add-apt-repository 182 # The following example is also the builtin default if nothing is specified 183 add_apt_repo_match: '^[\w-]+:\w' 184 185 186 ############################################################################## 187 # Section 2: source list entries 188 # 189 # This is a dictionary (unlike most block/net which are lists) 190 # 191 # The key of each source entry is the filename and will be prepended by 192 # /etc/apt/sources.list.d/ if it doesn't start with a '/'. 193 # If it doesn't end with .list it will be appended so that apt picks up its 194 # configuration. 195 # 196 # Whenever there is no content to be written into such a file, the key is 197 # not used as filename - yet it can still be used as index for merging 198 # configuration. 199 # 200 # The values inside the entries consist of the following optional entries: 201 # 'source': a sources.list entry (some variable replacements apply) 202 # 'keyid': providing a key to import via shortid or fingerprint 203 # 'key': providing a raw PGP key 204 # 'keyserver': specify an alternate keyserver to pull keys from that 205 # were specified by keyid 206 207 # This allows merging between multiple input files than a list like: 208 # cloud-config1 209 # sources: 210 # s1: {'key': 'key1', 'source': 'source1'} 211 # cloud-config2 212 # sources: 213 # s2: {'key': 'key2'} 214 # s1: {'keyserver': 'foo'} 215 # This would be merged to 216 # sources: 217 # s1: 218 # keyserver: foo 219 # key: key1 220 # source: source1 221 # s2: 222 # key: key2 223 # 224 # The following examples number the subfeatures per sources entry to ease 225 # identification in discussions. 226 227 228 sources: 229 curtin-dev-ppa.list: 230 # 2.1 source 231 # 232 # Creates a file in /etc/apt/sources.list.d/ for the sources list entry 233 # based on the key: "/etc/apt/sources.list.d/curtin-dev-ppa.list" 234 source: "deb http://ppa.launchpad.net/curtin-dev/test-archive/ubuntu bionic main" 235 236 # 2.2 keyid 237 # 238 # Importing a gpg key for a given key id. Used keyserver defaults to 239 # keyserver.ubuntu.com 240 keyid: F430BBA5 # GPG key ID published on a key server 241 242 ignored1: 243 # 2.3 PPA shortcut 244 # 245 # Setup correct apt sources.list line and Auto-Import the signing key 246 # from LP 247 # 248 # See https://help.launchpad.net/Packaging/PPA for more information 249 # this requires 'add-apt-repository'. This will create a file in 250 # /etc/apt/sources.list.d automatically, therefore the key here is 251 # ignored as filename in those cases. 252 source: "ppa:curtin-dev/test-archive" # Quote the string 253 254 my-repo2.list: 255 # 2.4 replacement variables 256 # 257 # sources can use $MIRROR, $PRIMARY, $SECURITY, $RELEASE and $KEY_FILE 258 # replacement variables. 259 # They will be replaced with the default or specified mirrors and the 260 # running release. 261 # The entry below would be possibly turned into: 262 # source: deb http://archive.ubuntu.com/ubuntu bionic multiverse 263 source: deb [signed-by=$KEY_FILE] $MIRROR $RELEASE multiverse 264 keyid: F430BBA5 265 266 my-repo3.list: 267 # this would have the same end effect as 'ppa:curtin-dev/test-archive' 268 source: "deb http://ppa.launchpad.net/curtin-dev/test-archive/ubuntu bionic main" 269 keyid: F430BBA5 # GPG key ID published on the key server 270 filename: curtin-dev-ppa.list 271 272 ignored2: 273 # 2.5 key only 274 # 275 # this would only import the key without adding a ppa or other source spec 276 # since this doesn't generate a source.list file the filename key is ignored 277 keyid: F430BBA5 # GPG key ID published on a key server 278 279 ignored3: 280 # 2.6 key id alternatives 281 # 282 # Keyid's can also be specified via their long fingerprints 283 keyid: B59D 5F15 97A5 04B7 E230 6DCA 0620 BBCF 0368 3F77 284 285 ignored4: 286 # 2.7 alternative keyservers 287 # 288 # One can also specify alternative keyservers to fetch keys from. 289 keyid: B59D 5F15 97A5 04B7 E230 6DCA 0620 BBCF 0368 3F77 290 keyserver: pgp.mit.edu 291 292 ignored5: 293 # 2.8 signed-by 294 # 295 # One can specify [signed-by=$KEY_FILE] in the source definition, which 296 # will make the key be installed in the directory /etc/cloud-init.gpg.d/ 297 # and the $KEY_FILE replacement variable will be replaced with the path 298 # to the specified key. If $KEY_FILE is used, but no key is specified, 299 # apt update will (rightfully) fail due to an invalid value. 300 source: deb [signed-by=$KEY_FILE] $MIRROR $RELEASE multiverse 301 keyid: B59D 5F15 97A5 04B7 E230 6DCA 0620 BBCF 0368 3F77 302 303 my-repo4.list: 304 # 2.9 raw key 305 # 306 # The apt signing key can also be specified by providing a pgp public key 307 # block. Providing the PGP key this way is the most robust method for 308 # specifying a key, as it removes dependency on a remote key server. 309 # 310 # As with keyid's this can be specified with or without some actual source 311 # content. 312 key: | # The value needs to start with -----BEGIN PGP PUBLIC KEY BLOCK----- 313 -----BEGIN PGP PUBLIC KEY BLOCK----- 314 Version: SKS 1.0.10 315 316 mI0ESpA3UQEEALdZKVIMq0j6qWAXAyxSlF63SvPVIgxHPb9Nk0DZUixn+akqytxG4zKCONz6 317 qLjoBBfHnynyVLfT4ihg9an1PqxRnTO+JKQxl8NgKGz6Pon569GtAOdWNKw15XKinJTDLjnj 318 9y96ljJqRcpV9t/WsIcdJPcKFR5voHTEoABE2aEXABEBAAG0GUxhdW5jaHBhZCBQUEEgZm9y 319 IEFsZXN0aWOItgQTAQIAIAUCSpA3UQIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEA7H 320 5Qi+CcVxWZ8D/1MyYvfj3FJPZUm2Yo1zZsQ657vHI9+pPouqflWOayRR9jbiyUFIn0VdQBrP 321 t0FwvnOFArUovUWoKAEdqR8hPy3M3APUZjl5K4cMZR/xaMQeQRZ5CHpS4DBKURKAHC0ltS5o 322 uBJKQOZm5iltJp15cgyIkBkGe8Mx18VFyVglAZey 323 =Y2oI 324 -----END PGP PUBLIC KEY BLOCK----- 

Disk setup

 1#cloud-config  2# Cloud-init supports the creation of simple partition tables and filesystems  3# on devices.  4  5# Default disk definitions for AWS  6# --------------------------------  7# (Not implemented yet, but provided for future documentation)  8  9disk_setup:  10 ephemeral0:  11 table_type: 'mbr'  12 layout: True  13 overwrite: False  14  15fs_setup:  16 - label: None,  17 filesystem: ext3  18 device: ephemeral0  19 partition: auto  20  21# Default disk definitions for Microsoft Azure  22# ------------------------------------------  23  24device_aliases: {'ephemeral0': '/dev/sdb'}  25disk_setup:  26 ephemeral0:  27 table_type: mbr  28 layout: True  29 overwrite: False  30  31fs_setup:  32 - label: ephemeral0  33 filesystem: ext4  34 device: ephemeral0.1  35 replace_fs: ntfs  36  37  38# Data disks definitions for Microsoft Azure  39# ------------------------------------------  40  41disk_setup:  42 /dev/disk/azure/scsi1/lun0:  43 table_type: gpt  44 layout: True  45 overwrite: True  46  47fs_setup:  48 - device: /dev/disk/azure/scsi1/lun0  49 partition: 1  50 filesystem: ext4  51  52  53# Default disk definitions for SmartOS  54# ------------------------------------  55  56device_aliases: {'ephemeral0': '/dev/vdb'}  57disk_setup:  58 ephemeral0:  59 table_type: mbr  60 layout: False  61 overwrite: False  62  63fs_setup:  64 - label: ephemeral0  65 filesystem: ext4  66 device: ephemeral0.0  67  68# Caveat for SmartOS: if ephemeral disk is not defined, then the disk will  69# not be automatically added to the mounts.  70  71  72# The default definition is used to make sure that the ephemeral storage is  73# setup properly.  74  75# "disk_setup": disk partitioning  76# --------------------------------  77  78# The disk_setup directive instructs Cloud-init to partition a disk. The format is:  79  80disk_setup:  81 ephemeral0:  82 table_type: 'mbr'  83 layout: true  84 /dev/xvdh:  85 table_type: 'gpt'  86 layout:  87 - 33  88 - [33, 82]  89 - [33, '44479540-F297-41B2-9AF7-D131D5F0458A']  90 overwrite: True  91  92# The format is a list of dicts of dicts. The first value is the name of the  93# device and the subsequent values define how to create and layout the  94# partition.  95# The general format is:  96# disk_setup:  97# <DEVICE>:  98# table_type: 'mbr'|'gpt'  99# layout: <LAYOUT|BOOL> 100# overwrite: <BOOL> 101# 102# Where: 103# <DEVICE>: The name of the device. 'ephemeralX' and 'swap' are special 104# values which are specific to the cloud. For these devices 105# Cloud-init will look up what the real devices is and then 106# use it. 107# 108# For other devices, the kernel device name is used. At this 109# time only simply kernel devices are supported, meaning 110# that device mapper and other targets may not work. 111# 112# Note: At this time, there is no handling or setup of 113# device mapper targets. 114# 115# table_type=<TYPE>: Currently the following are supported: 116# 'mbr': default and setups a MS-DOS partition table 117# 'gpt': setups a GPT partition table 118# 119# Note: At this time only 'mbr' and 'gpt' partition tables 120# are allowed. It is anticipated in the future that 121# we'll also have "RAID" to create a mdadm RAID. 122# 123# layout={...}: The device layout. This is a list of values, with the 124# percentage of disk that partition will take. 125# Valid options are: 126# [<SIZE>, [<SIZE>, <PART_TYPE]] 127# 128# Where <SIZE> is the _percentage_ of the disk to use, while 129# <PART_TYPE> is either the numerical value of the partition type 130# (two digit code from fdisk, four digit code from gdisk) or a full 131# GPT partition GUID. 132# 133# The following setups two partitions, with the first 134# partition having a swap label, taking 1/3 of the disk space 135# and the remainder being used as the second partition. 136# /dev/xvdh': 137# table_type: 'mbr' 138# layout: 139# - [33,82] 140# - 66 141# overwrite: True 142# 143# When layout is "true" it means single partition the entire 144# device. 145# 146# When layout is "false" it means don't partition or ignore 147# existing partitioning. 148# 149# If layout is set to "true" and overwrite is set to "false", 150# it will skip partitioning the device without a failure. 151# 152# overwrite=<BOOL>: This describes whether to ride with safetys on and 153# everything holstered. 154# 155# 'false' is the default, which means that: 156# 1. The device will be checked for a partition table 157# 2. The device will be checked for a filesystem 158# 3. If either a partition of filesystem is found, then 159# the operation will be _skipped_. 160# 161# 'true' is cowboy mode. There are no checks and things are 162# done blindly. USE with caution, you can do things you 163# really, really don't want to do. 164# 165# 166# fs_setup: Setup the filesystem 167# ------------------------------ 168# 169# fs_setup describes the how the filesystems are supposed to look. 170 171fs_setup: 172 - label: ephemeral0 173 filesystem: 'ext3' 174 device: 'ephemeral0' 175 partition: 'auto' 176 - label: mylabl2 177 filesystem: 'ext4' 178 device: '/dev/xvda1' 179 - cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s 180 label: mylabl3 181 filesystem: 'btrfs' 182 device: '/dev/xvdh' 183 184# The general format is: 185# fs_setup: 186# - label: <LABEL> 187# filesystem: <FS_TYPE> 188# device: <DEVICE> 189# partition: <PART_VALUE> 190# overwrite: <OVERWRITE> 191# replace_fs: <FS_TYPE> 192# 193# Where: 194# <LABEL>: The filesystem label to be used. If set to None, no label is 195# used. 196# 197# <FS_TYPE>: The filesystem type. It is assumed that the there 198# will be a "mkfs.<FS_TYPE>" that behaves likes "mkfs". On a standard 199# Ubuntu Cloud Image, this means that you have the option of ext{2,3,4}, 200# and vfat by default. 201# 202# <DEVICE>: The device name. Special names of 'ephemeralX' or 'swap' 203# are allowed and the actual device is acquired from the cloud datasource. 204# When using 'ephemeralX' (i.e. ephemeral0), make sure to leave the 205# label as 'ephemeralX' otherwise there may be issues with the mounting 206# of the ephemeral storage layer. 207# 208# If you define the device as 'ephemeralX.Y' then Y will be interpetted 209# as a partition value. However, ephemeralX.0 is the _same_ as ephemeralX. 210# 211# <PART_VALUE>: 212# Partition definitions are overwritten if you use the '<DEVICE>.Y' notation. 213# 214# The valid options are: 215# "auto|any": tell cloud-init not to care whether there is a partition 216# or not. Auto will use the first partition that does not contain a 217# filesystem already. In the absence of a partition table, it will 218# put it directly on the disk. 219# 220# "auto": If a filesystem that matches the specification in terms of 221# label, filesystem and device, then cloud-init will skip the creation 222# of the filesystem. 223# 224# "any": If a filesystem that matches the filesystem type and device, 225# then cloud-init will skip the creation of the filesystem. 226# 227# Devices are selected based on first-detected, starting with partitions 228# and then the raw disk. Consider the following: 229# NAME FSTYPE LABEL 230# xvdb 231# |-xvdb1 ext4 232# |-xvdb2 233# |-xvdb3 btrfs test 234# \-xvdb4 ext4 test 235# 236# If you ask for 'auto', label of 'test, and filesystem of 'ext4' 237# then cloud-init will select the 2nd partition, even though there 238# is a partition match at the 4th partition. 239# 240# If you ask for 'any' and a label of 'test', then cloud-init will 241# select the 1st partition. 242# 243# If you ask for 'auto' and don't define label, then cloud-init will 244# select the 1st partition. 245# 246# In general, if you have a specific partition configuration in mind, 247# you should define either the device or the partition number. 'auto' 248# and 'any' are specifically intended for formatting ephemeral storage 249# or for simple schemes. 250# 251# "none": Put the filesystem directly on the device. 252# 253# <NUM>: where NUM is the actual partition number. 254# 255# <OVERWRITE>: Defines whether or not to overwrite any existing 256# filesystem. 257# 258# "true": Indiscriminately destroy any pre-existing filesystem. Use at 259# your own peril. 260# 261# "false": If an existing filesystem exists, skip the creation. 262# 263# <REPLACE_FS>: This is a special directive, used for Microsoft Azure that 264# instructs cloud-init to replace a filesystem of <FS_TYPE>. NOTE: 265# unless you define a label, this requires the use of the 'any' partition 266# directive. 267# 268# Behavior Caveat: The default behavior is to _check_ if the filesystem exists. 269# If a filesystem matches the specification, then the operation is a no-op. 

Configure data sources

 1#cloud-config  2  3# Documentation on data sources configuration options  4datasource:  5 # Ec2   6 Ec2:  7 # timeout: the timeout value for a request at metadata service  8 timeout : 50  9 # The length in seconds to wait before giving up on the metadata 10 # service. The actual total wait could be up to  11 # len(resolvable_metadata_urls)*timeout 12 max_wait : 240 13 14 #metadata_url: a list of URLs to check for metadata services 15 metadata_urls: 16 - http://169.254.169.254:80 17 - http://instance-data:8773 18 19 MAAS: 20 timeout : 50 21 max_wait : 120 22 23 # there are no default values for metadata_url or oauth credentials 24 # If no credentials are present, non-authed attempts will be made. 25 metadata_url: http://mass-host.localdomain/source 26 consumer_key: Xh234sdkljf 27 token_key: kjfhgb3n 28 token_secret: 24uysdfx1w4 29 30 NoCloud: 31 # default seedfrom is None 32 # if found, then it should contain a url with: 33 # <url>/user-data and <url>/meta-data 34 # seedfrom: http://my.example.com/i-abcde/ 35 seedfrom: None 36 37 # fs_label: the label on filesystems to be searched for NoCloud source 38 fs_label: cidata 39 40 # these are optional, but allow you to basically provide a datasource 41 # right here 42 user-data: | 43 # This is the user-data verbatim 44 meta-data: | 45 instance-id: i-87018aed 46 local-hostname: myhost.internal 47 48 SmartOS: 49 # For KVM guests: 50 # Smart OS datasource works over a serial console interacting with 51 # a server on the other end. By default, the second serial console is the 52 # device. SmartOS also uses a serial timeout of 60 seconds. 53 serial_device: /dev/ttyS1 54 serial_timeout: 60 55 56 # For LX-Brand Zones guests: 57 # Smart OS datasource works over a socket interacting with 58 # the host on the other end. By default, the socket file is in 59 # the native .zoncontrol directory. 60 metadata_sockfile: /native/.zonecontrol/metadata.sock 61 62 # a list of keys that will not be base64 decoded even if base64_all 63 no_base64_decode: ['root_authorized_keys', 'motd_sys_info', 64 'iptables_disable'] 65 # a plaintext, comma delimited list of keys whose values are b64 encoded 66 base64_keys: [] 67 # a boolean indicating that all keys not in 'no_base64_decode' are encoded 68 base64_all: False 

Create partitions and filesystems

 1#cloud-config  2# Cloud-init supports the creation of simple partition tables and filesystems  3# on devices.  4  5# Default disk definitions for AWS  6# --------------------------------  7# (Not implemented yet, but provided for future documentation)  8  9disk_setup:  10 ephemeral0:  11 table_type: 'mbr'  12 layout: True  13 overwrite: False  14  15fs_setup:  16 - label: None,  17 filesystem: ext3  18 device: ephemeral0  19 partition: auto  20  21# Default disk definitions for Microsoft Azure  22# ------------------------------------------  23  24device_aliases: {'ephemeral0': '/dev/sdb'}  25disk_setup:  26 ephemeral0:  27 table_type: mbr  28 layout: True  29 overwrite: False  30  31fs_setup:  32 - label: ephemeral0  33 filesystem: ext4  34 device: ephemeral0.1  35 replace_fs: ntfs  36  37  38# Data disks definitions for Microsoft Azure  39# ------------------------------------------  40  41disk_setup:  42 /dev/disk/azure/scsi1/lun0:  43 table_type: gpt  44 layout: True  45 overwrite: True  46  47fs_setup:  48 - device: /dev/disk/azure/scsi1/lun0  49 partition: 1  50 filesystem: ext4  51  52  53# Default disk definitions for SmartOS  54# ------------------------------------  55  56device_aliases: {'ephemeral0': '/dev/vdb'}  57disk_setup:  58 ephemeral0:  59 table_type: mbr  60 layout: False  61 overwrite: False  62  63fs_setup:  64 - label: ephemeral0  65 filesystem: ext4  66 device: ephemeral0.0  67  68# Caveat for SmartOS: if ephemeral disk is not defined, then the disk will  69# not be automatically added to the mounts.  70  71  72# The default definition is used to make sure that the ephemeral storage is  73# setup properly.  74  75# "disk_setup": disk partitioning  76# --------------------------------  77  78# The disk_setup directive instructs Cloud-init to partition a disk. The format is:  79  80disk_setup:  81 ephemeral0:  82 table_type: 'mbr'  83 layout: true  84 /dev/xvdh:  85 table_type: 'gpt'  86 layout:  87 - 33  88 - [33, 82]  89 - [33, '44479540-F297-41B2-9AF7-D131D5F0458A']  90 overwrite: True  91  92# The format is a list of dicts of dicts. The first value is the name of the  93# device and the subsequent values define how to create and layout the  94# partition.  95# The general format is:  96# disk_setup:  97# <DEVICE>:  98# table_type: 'mbr'|'gpt'  99# layout: <LAYOUT|BOOL> 100# overwrite: <BOOL> 101# 102# Where: 103# <DEVICE>: The name of the device. 'ephemeralX' and 'swap' are special 104# values which are specific to the cloud. For these devices 105# Cloud-init will look up what the real devices is and then 106# use it. 107# 108# For other devices, the kernel device name is used. At this 109# time only simply kernel devices are supported, meaning 110# that device mapper and other targets may not work. 111# 112# Note: At this time, there is no handling or setup of 113# device mapper targets. 114# 115# table_type=<TYPE>: Currently the following are supported: 116# 'mbr': default and setups a MS-DOS partition table 117# 'gpt': setups a GPT partition table 118# 119# Note: At this time only 'mbr' and 'gpt' partition tables 120# are allowed. It is anticipated in the future that 121# we'll also have "RAID" to create a mdadm RAID. 122# 123# layout={...}: The device layout. This is a list of values, with the 124# percentage of disk that partition will take. 125# Valid options are: 126# [<SIZE>, [<SIZE>, <PART_TYPE]] 127# 128# Where <SIZE> is the _percentage_ of the disk to use, while 129# <PART_TYPE> is either the numerical value of the partition type 130# (two digit code from fdisk, four digit code from gdisk) or a full 131# GPT partition GUID. 132# 133# The following setups two partitions, with the first 134# partition having a swap label, taking 1/3 of the disk space 135# and the remainder being used as the second partition. 136# /dev/xvdh': 137# table_type: 'mbr' 138# layout: 139# - [33,82] 140# - 66 141# overwrite: True 142# 143# When layout is "true" it means single partition the entire 144# device. 145# 146# When layout is "false" it means don't partition or ignore 147# existing partitioning. 148# 149# If layout is set to "true" and overwrite is set to "false", 150# it will skip partitioning the device without a failure. 151# 152# overwrite=<BOOL>: This describes whether to ride with safetys on and 153# everything holstered. 154# 155# 'false' is the default, which means that: 156# 1. The device will be checked for a partition table 157# 2. The device will be checked for a filesystem 158# 3. If either a partition of filesystem is found, then 159# the operation will be _skipped_. 160# 161# 'true' is cowboy mode. There are no checks and things are 162# done blindly. USE with caution, you can do things you 163# really, really don't want to do. 164# 165# 166# fs_setup: Setup the filesystem 167# ------------------------------ 168# 169# fs_setup describes the how the filesystems are supposed to look. 170 171fs_setup: 172 - label: ephemeral0 173 filesystem: 'ext3' 174 device: 'ephemeral0' 175 partition: 'auto' 176 - label: mylabl2 177 filesystem: 'ext4' 178 device: '/dev/xvda1' 179 - cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s 180 label: mylabl3 181 filesystem: 'btrfs' 182 device: '/dev/xvdh' 183 184# The general format is: 185# fs_setup: 186# - label: <LABEL> 187# filesystem: <FS_TYPE> 188# device: <DEVICE> 189# partition: <PART_VALUE> 190# overwrite: <OVERWRITE> 191# replace_fs: <FS_TYPE> 192# 193# Where: 194# <LABEL>: The filesystem label to be used. If set to None, no label is 195# used. 196# 197# <FS_TYPE>: The filesystem type. It is assumed that the there 198# will be a "mkfs.<FS_TYPE>" that behaves likes "mkfs". On a standard 199# Ubuntu Cloud Image, this means that you have the option of ext{2,3,4}, 200# and vfat by default. 201# 202# <DEVICE>: The device name. Special names of 'ephemeralX' or 'swap' 203# are allowed and the actual device is acquired from the cloud datasource. 204# When using 'ephemeralX' (i.e. ephemeral0), make sure to leave the 205# label as 'ephemeralX' otherwise there may be issues with the mounting 206# of the ephemeral storage layer. 207# 208# If you define the device as 'ephemeralX.Y' then Y will be interpetted 209# as a partition value. However, ephemeralX.0 is the _same_ as ephemeralX. 210# 211# <PART_VALUE>: 212# Partition definitions are overwritten if you use the '<DEVICE>.Y' notation. 213# 214# The valid options are: 215# "auto|any": tell cloud-init not to care whether there is a partition 216# or not. Auto will use the first partition that does not contain a 217# filesystem already. In the absence of a partition table, it will 218# put it directly on the disk. 219# 220# "auto": If a filesystem that matches the specification in terms of 221# label, filesystem and device, then cloud-init will skip the creation 222# of the filesystem. 223# 224# "any": If a filesystem that matches the filesystem type and device, 225# then cloud-init will skip the creation of the filesystem. 226# 227# Devices are selected based on first-detected, starting with partitions 228# and then the raw disk. Consider the following: 229# NAME FSTYPE LABEL 230# xvdb 231# |-xvdb1 ext4 232# |-xvdb2 233# |-xvdb3 btrfs test 234# \-xvdb4 ext4 test 235# 236# If you ask for 'auto', label of 'test, and filesystem of 'ext4' 237# then cloud-init will select the 2nd partition, even though there 238# is a partition match at the 4th partition. 239# 240# If you ask for 'any' and a label of 'test', then cloud-init will 241# select the 1st partition. 242# 243# If you ask for 'auto' and don't define label, then cloud-init will 244# select the 1st partition. 245# 246# In general, if you have a specific partition configuration in mind, 247# you should define either the device or the partition number. 'auto' 248# and 'any' are specifically intended for formatting ephemeral storage 249# or for simple schemes. 250# 251# "none": Put the filesystem directly on the device. 252# 253# <NUM>: where NUM is the actual partition number. 254# 255# <OVERWRITE>: Defines whether or not to overwrite any existing 256# filesystem. 257# 258# "true": Indiscriminately destroy any pre-existing filesystem. Use at 259# your own peril. 260# 261# "false": If an existing filesystem exists, skip the creation. 262# 263# <REPLACE_FS>: This is a special directive, used for Microsoft Azure that 264# instructs cloud-init to replace a filesystem of <FS_TYPE>. NOTE: 265# unless you define a label, this requires the use of the 'any' partition 266# directive. 267# 268# Behavior Caveat: The default behavior is to _check_ if the filesystem exists. 269# If a filesystem matches the specification, then the operation is a no-op.