Customizare containere cu cloud-init in LXD

Postat la Fri 15 June 2018 in tutoriale, lxd, lxc

Atunci avem de configurat un server nou parcurgem cel mai des urmatorii pasi:

  • actualizare sistem
  • securizare sistem
  • creare useri / chei ssh
  • instalare pachete si configurarelor

Acest pas poate lua timp indelungat in cazul multor servere sau plictisitor daca se repeta si expus erorilor umane la parcurgerea acestor pasi. De aceea exista exista solutii pentru acest lucru:

Prima optiune fie presupune existenta unei chei ssh pentru conectare sau instalarea unui agent client ce executa comenzi primite de la un master, cea de a doua ruleaza la initializarea containerelor.

Nota: punem folosi cloud-init sa instalam clientii si sa configuram agentii saltstack (salt-minion), puppet, chef;

Un exemplu de fisier cloud-init (config.yml):

#cloud-config

# Apply updates using apt
package_upgrade: true

# User setup
users:
 - name: cristian
   ssh-authorized-keys:
     - ***inserati cheia public aici***
   sudo: ['ALL=(ALL) NOPASSWD:ALL']
   groups: sudo
   shell: /bin/bash

# Install packages
packages:
 - openssh-server
 - nginx
 - php-common
 - php
 - php-cli
 - php-common
 - php-fpm
 - php-gd
 - php-mysql
 - php-opcache
 - php-pear

Cum puteti realiza configurari avansate gasiti in documentatia oficiala aici.

Acest fisier va fi inserat in configuratia containerului in variabila user.user-data:

lxc init ubuntu:18.04 u2

lxc config set u2 user.user-data - < config.yml

Acum configuratia containerului va fi:

architecture: x86_64
config:
image.architecture: amd64
image.description: ubuntu 18.04 LTS amd64 (release) (20180613)
image.label: release
image.os: ubuntu
image.release: bionic
image.serial: "20180613"
image.version: "18.04"
user.user-data: |
  #cloud-config

  # Apply updates using apt
  package_upgrade: true

  #User setup
  users:
    - name: cristian
      ssh-authorized-keys:
        - ssh-rsa AAAAB<editat>dfQ== cristi@cristi
      sudo: ['ALL=(ALL) NOPASSWD:ALL']
      groups: sudo
      shell: /bin/bash

  # Install packages
  packages:
    - openssh-server
    - nginx
    - php-common
    - php
    - php-cli
    - php-common
    - php-fpm
    - php-gd
    - php-mysql
    - php-opcache
    - php-pear
volatile.apply_template: create
volatile.base_image: ae465acff89b1a40b20b9143f97d627175e2d4886e03c06978bb930368a2341c
volatile.eth0.hwaddr: 00:16:3e:cf:6c:f7
volatile.idmap.base: "0"
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

Acum putem porni containerul:

lxc start u2

Asteptam cateva minute ca scriptul sa ruleze si putem verifica rezultatul.

De asemenea putem vizualiza log-ul procesului cloud-init:

tail -f /var/log/cloud-init.log

sau rezultatul comenzilor rulate de cloud-init in fisierul:

tail -f /var/log/cloud-init-output.log

Nota:

  • am reusit rularea acesti pasi doar folosind imaginile oficiale Ubuntu ce includ pachetul cloud-init.
  • imaginile CentOS nu includ cloud-init default, si trebuie realizate imagini personalizate cu acest pachet. Eu nu am putut crea o imagine CentOS 7 care sa functioneze (versiunea de pachet fie e prea veche, sau include bug-uri).

Update 15 Nov 2019:

Cloud-init a fost inclus in imaginile cloud de pe images.linuxcontainers.org ca de exemplu:

  • centos/7/cloud
  • debian/10/cloud
  • fedora/31/cloud

Articolul face parte din seria Virtualizare cu LXD