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:
- sisteme de provisioning / management al configuratiilor : ansible , saltstack , puppet
- scripturi ce ruleaza la crearea/pornirea containerelor: cloud-init
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