kameleon-builder 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.editorconfig +0 -0
- data/.env +63 -15
- data/.gitignore +1 -0
- data/README.rst +4 -2
- data/Vagrantfile +13 -52
- data/bin/kameleon +5 -0
- data/completion/_kameleon.zsh +18 -0
- data/completion/kameleon.bash +13 -0
- data/completion/kameleon.fish +10 -0
- data/contrib/polipo_env.sh +2 -0
- data/contrib/steps/export/save_as_g5k.yaml +63 -0
- data/contrib/steps/setup/add_to_sudoers.yaml +5 -0
- data/docs/Makefile +10 -6
- data/docs/README.md +17 -0
- data/docs/source/_static/kameleon-logo.png +0 -0
- data/docs/source/_static/kameleon-logo.xcf +0 -0
- data/docs/source/_static/kameleon-long.png +0 -0
- data/docs/source/aliases.rst +4 -2
- data/docs/source/checkpoint.rst +2 -0
- data/docs/source/commands.rst +4 -3
- data/docs/source/conf.py +15 -7
- data/docs/source/context.rst +7 -4
- data/docs/source/faq.rst +39 -1
- data/docs/source/getting_started.rst +227 -1
- data/docs/source/grid5000_tutorial.rst +110 -0
- data/docs/source/index.rst +7 -2
- data/docs/source/installation.rst +12 -4
- data/docs/source/persistent_cache.rst +34 -0
- data/docs/source/recipe.rst +23 -16
- data/docs/source/use_cases.rst +93 -0
- data/docs/source/workspace.rst +2 -0
- data/kameleon-builder.gemspec +7 -1
- data/lib/kameleon.rb +3 -6
- data/lib/kameleon/cli.rb +104 -50
- data/lib/kameleon/compat.rb +39 -0
- data/lib/kameleon/context.rb +43 -13
- data/lib/kameleon/engine.rb +118 -77
- data/lib/kameleon/environment.rb +3 -5
- data/lib/kameleon/error.rb +15 -9
- data/lib/kameleon/logger.rb +7 -4
- data/lib/kameleon/persistent_cache.rb +139 -0
- data/lib/kameleon/recipe.rb +200 -81
- data/lib/kameleon/shell.rb +51 -16
- data/omnibus/.gitignore +11 -0
- data/omnibus/.kitchen.yml +25 -0
- data/omnibus/Berksfile +9 -0
- data/omnibus/Berksfile.lock +25 -0
- data/omnibus/Gemfile +12 -0
- data/omnibus/README.md +94 -0
- data/omnibus/config/projects/kameleon.rb +23 -0
- data/omnibus/config/software/kameleon.rb +24 -0
- data/omnibus/config/software/polipo.rb +30 -0
- data/omnibus/config/software/ruby.rb +158 -0
- data/omnibus/files/mac_dmg/Resources/background.png +0 -0
- data/omnibus/files/mac_dmg/Resources/icon.png +0 -0
- data/omnibus/files/mac_pkg/Resources/background.png +0 -0
- data/omnibus/files/mac_pkg/Resources/license.html +1 -0
- data/omnibus/files/mac_pkg/Resources/welcome.html +9 -0
- data/omnibus/omnibus.rb +27 -0
- data/omnibus/package-scripts/kameleon/makeselfinst +27 -0
- data/omnibus/package-scripts/kameleon/postrm +9 -0
- data/templates/archlinux-desktop.yaml +25 -0
- data/templates/archlinux.yaml +106 -0
- data/templates/debian-testing.yaml +25 -0
- data/templates/debian7-desktop.yaml +25 -0
- data/templates/{debian-wheezy-docker.yaml → debian7-docker.yaml} +30 -16
- data/templates/debian7-g5k.yaml +97 -0
- data/templates/debian7-oar-dev.yaml +51 -0
- data/templates/debian7.yaml +128 -0
- data/templates/extend.erb +23 -0
- data/templates/fedora-rawhide.yaml +30 -0
- data/templates/fedora20-desktop.yaml +21 -0
- data/templates/fedora20.yaml +105 -0
- data/templates/{debian-wheezy-chroot.yaml → old-debian7.yaml} +51 -38
- data/templates/{aliases → steps/aliases}/defaults.yaml +37 -12
- data/templates/steps/bootstrap/archlinux/arch_bootstrap.yaml +219 -0
- data/templates/steps/bootstrap/archlinux/install_bootloader.yaml +46 -0
- data/templates/steps/bootstrap/archlinux/populate_disk.yaml +39 -0
- data/templates/steps/bootstrap/debian/debootstrap.yaml +18 -10
- data/templates/steps/bootstrap/debian/debootstrap_arm.yaml +31 -0
- data/templates/steps/bootstrap/fedora/liveos_bootstrap.yaml +123 -0
- data/templates/steps/bootstrap/g5k_reserv.yaml +70 -0
- data/templates/steps/bootstrap/initialize_disk_chroot.yaml +84 -0
- data/templates/steps/bootstrap/initialize_disk_qemu.yaml +72 -0
- data/templates/steps/bootstrap/install_bootloader.yaml +42 -0
- data/templates/steps/bootstrap/prepare_chroot.yaml +126 -0
- data/templates/steps/bootstrap/prepare_docker.yaml +19 -8
- data/templates/steps/bootstrap/prepare_qemu.yaml +47 -0
- data/templates/steps/bootstrap/start_chroot.yaml +11 -2
- data/templates/steps/bootstrap/start_docker.yaml +2 -2
- data/templates/steps/bootstrap/start_qemu.yaml +75 -0
- data/templates/steps/bootstrap/ubuntu/debootstrap.yaml +27 -0
- data/templates/steps/breakpoint.yaml +2 -0
- data/templates/{checkpoints → steps/checkpoints}/docker.yaml +0 -0
- data/templates/steps/checkpoints/qcow2.yaml +38 -0
- data/templates/steps/checkpoints/qemu.yaml +39 -0
- data/templates/steps/export/clean_appliance.yaml +7 -1
- data/templates/steps/export/compact_qcow_img.yaml +12 -0
- data/templates/steps/export/save_appliance.yaml +58 -0
- data/templates/steps/export/save_appliance_from_g5k.yaml +47 -0
- data/templates/steps/export/save_vagrant_box.yaml +29 -0
- data/templates/steps/setup/archlinux/configure_keyboard.yaml +9 -0
- data/templates/steps/setup/archlinux/configure_network.yaml +9 -0
- data/templates/steps/setup/archlinux/configure_ruby.yaml +7 -0
- data/templates/steps/setup/archlinux/configure_system.yaml +20 -0
- data/templates/steps/setup/archlinux/install_dev_tools.yaml +18 -0
- data/templates/steps/setup/archlinux/install_gnome.yaml +27 -0
- data/templates/steps/setup/archlinux/install_software.yaml +9 -0
- data/templates/steps/setup/archlinux/install_yaourt.yaml +29 -0
- data/templates/steps/setup/autologin.yaml +16 -0
- data/templates/steps/setup/create_group.yaml +12 -0
- data/templates/steps/setup/create_user.yaml +9 -10
- data/templates/steps/setup/debian/configure_apt.yaml +65 -0
- data/templates/steps/setup/debian/configure_kernel.yaml +18 -0
- data/templates/steps/setup/debian/{keyboard_config.yaml → configure_keyboard.yaml} +1 -1
- data/templates/steps/setup/debian/{network_config.yaml → configure_network.yaml} +0 -0
- data/templates/steps/setup/debian/{system_config.yaml → configure_system.yaml} +0 -0
- data/templates/steps/setup/debian/install_gnome.yaml +13 -0
- data/templates/steps/setup/debian/install_kde.yaml +13 -0
- data/templates/steps/setup/debian/install_software.yaml +2 -0
- data/templates/steps/setup/debian/oar/oar_debian_config_frontend.yaml +8 -0
- data/templates/steps/setup/debian/oar/oar_debian_config_node.yaml +5 -0
- data/templates/steps/setup/debian/oar/oar_debian_config_server.yaml +5 -0
- data/templates/steps/setup/debian/oar/oar_prereq_install.yaml +16 -0
- data/templates/steps/setup/debian/setup_vagrant_box.yaml +52 -0
- data/templates/steps/setup/debian/upgrade_system.yaml +15 -0
- data/templates/steps/setup/fedora/configure_network.yaml +30 -0
- data/templates/steps/setup/fedora/configure_system.yaml +59 -0
- data/templates/steps/setup/fedora/install_software.yaml +3 -0
- data/templates/steps/setup/fedora/update_system.yaml +10 -0
- data/templates/steps/setup/oar/oar_config_devel.yaml +21 -0
- data/templates/steps/setup/oar/oar_config_frontend.yaml +38 -0
- data/templates/steps/setup/oar/oar_config_node.yaml +4 -0
- data/templates/steps/setup/oar/oar_config_server.yaml +25 -0
- data/templates/steps/setup/oar/oar_config_system.yaml +34 -0
- data/templates/steps/setup/oar/oar_devel_prereq_install.yaml +5 -0
- data/templates/steps/setup/oar/oar_git_install.yaml +21 -0
- data/templates/steps/setup/ubuntu/configure_apt.yaml +67 -0
- data/templates/ubuntu-12.04-desktop.yaml +25 -0
- data/templates/ubuntu-12.04.yaml +128 -0
- data/templates/ubuntu-14.04-desktop.yaml +27 -0
- data/templates/ubuntu-14.04.yaml +25 -0
- data/templates/vagrant-debian7.yaml +31 -0
- data/version.txt +1 -1
- metadata +155 -28
- checksums.yaml +0 -7
- data/templates/checkpoints/qcow2.yaml +0 -44
- data/templates/fedora-docker.yaml +0 -96
- data/templates/steps/bootstrap/fedora/docker_bootstrap.yaml +0 -25
- data/templates/steps/bootstrap/fedora/yum_bootstrap.yaml +0 -22
- data/templates/steps/bootstrap/prepare_appliance_with_nbd.yaml +0 -93
- data/templates/steps/export/build_appliance_from_docker.yaml +0 -105
- data/templates/steps/export/save_appliance_from_nbd.yaml +0 -54
- data/templates/steps/setup/debian/kernel_install.yaml +0 -20
- data/templates/steps/setup/debian/software_install.yaml +0 -15
- data/templates/steps/setup/fedora/kernel_install.yaml +0 -27
- data/templates/steps/setup/fedora/software_install.yaml +0 -10
data/docs/source/checkpoint.rst
CHANGED
data/docs/source/commands.rst
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
.. _`commands`:
|
2
|
+
|
1
3
|
--------
|
2
4
|
Commands
|
3
5
|
--------
|
@@ -12,8 +14,7 @@ The exec command is a simple command execute, in the given context, the user
|
|
12
14
|
command in argument. The context is specified by the name suffix local, out or
|
13
15
|
in like this ``exec_[in/out/local]``.
|
14
16
|
|
15
|
-
It is
|
16
|
-
callable with bash.
|
17
|
+
It is mostly used to execute bash script or other comand line application.
|
17
18
|
|
18
19
|
For example this command save the message "Hello world:" in the hello.txt file
|
19
20
|
within the workdir of the *in* context:
|
@@ -40,7 +41,7 @@ to the new_file within the in context workdir:
|
|
40
41
|
- exec_out: cat my_file
|
41
42
|
- exec_in: cat > new_file
|
42
43
|
|
43
|
-
This command are usually not used directly but with
|
44
|
+
This command are usually not used directly but with :ref:`Aliases`.
|
44
45
|
|
45
46
|
Hooks
|
46
47
|
~~~~~
|
data/docs/source/conf.py
CHANGED
@@ -27,8 +27,8 @@ import datetime
|
|
27
27
|
# Add any Sphinx extension module names here, as strings. They can be
|
28
28
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
29
29
|
# ones.
|
30
|
-
extensions = []
|
31
|
-
|
30
|
+
extensions = ['sphinx.ext.todo']
|
31
|
+
AUTHORS = "Michael Mercier, Salem Harrache"
|
32
32
|
# Add any paths that contain templates here, relative to this directory.
|
33
33
|
templates_path = ['_templates']
|
34
34
|
|
@@ -124,7 +124,7 @@ if not on_rtd: # only import and set the theme if we're building docs locally
|
|
124
124
|
|
125
125
|
# The name of an image file (relative to this directory) to place at the top
|
126
126
|
# of the sidebar.
|
127
|
-
#html_logo =
|
127
|
+
# html_logo = '_static/kameleon-long.png'
|
128
128
|
|
129
129
|
# The name of an image file (within the static path) to use as favicon of the
|
130
130
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
@@ -188,14 +188,22 @@ htmlhelp_basename = 'Kameleondoc'
|
|
188
188
|
|
189
189
|
# -- Options for LaTeX output ---------------------------------------------
|
190
190
|
|
191
|
-
|
191
|
+
latex_logo = '_static/kameleon-long.png'
|
192
|
+
|
193
|
+
latex_elements = {
|
194
|
+
'tableofcontents': "\\tableofcontents",
|
195
|
+
'preamble': '''%
|
196
|
+
\pagestyle{plain}
|
197
|
+
\pagenumbering{arabic}
|
198
|
+
''',
|
199
|
+
}
|
192
200
|
|
193
201
|
# Grouping the document tree into LaTeX files. List of tuples
|
194
202
|
# (source start file, target name, title,
|
195
203
|
# author, documentclass [howto, manual, or own class]).
|
196
204
|
latex_documents = [
|
197
205
|
('index', 'Kameleon.tex', u'Kameleon Documentation',
|
198
|
-
|
206
|
+
AUTHORS, 'howto'),
|
199
207
|
]
|
200
208
|
|
201
209
|
# The name of an image file (relative to this directory) to place at the top of
|
@@ -225,7 +233,7 @@ latex_documents = [
|
|
225
233
|
# (source start file, name, description, authors, manual section).
|
226
234
|
man_pages = [
|
227
235
|
('index', 'kameleon', u'Kameleon Documentation',
|
228
|
-
|
236
|
+
AUTHORS.split(', '), 1)
|
229
237
|
]
|
230
238
|
|
231
239
|
# If true, show URL addresses after external links.
|
@@ -239,7 +247,7 @@ man_pages = [
|
|
239
247
|
# dir menu entry, description, category)
|
240
248
|
texinfo_documents = [
|
241
249
|
('index', 'Kameleon', u'Kameleon Documentation',
|
242
|
-
|
250
|
+
AUTHORS, 'Kameleon',
|
243
251
|
'One line description of project.', 'Miscellaneous'),
|
244
252
|
]
|
245
253
|
|
data/docs/source/context.rst
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
+
.. _`context`:
|
2
|
+
|
1
3
|
-------
|
2
4
|
Context
|
3
5
|
-------
|
4
6
|
|
5
|
-
To understand how Kameleon
|
6
|
-
is an execution environnement with
|
7
|
-
tools (debootstrap, yum, ...) and all
|
8
|
-
...).
|
7
|
+
To understand how Kameleon works you have to get the *context* notion. A context
|
8
|
+
is an execution environnement with its variables (like $PATH, $TERM,...), its
|
9
|
+
tools (debootstrap, yum, ...) and all its specifics (filesystem, local/remote,
|
10
|
+
...). It also manage the connections to your context and make it easy and reliable.
|
11
|
+
When you build an appliance you deal with 3 contexts:
|
9
12
|
|
10
13
|
- The *local* context which is the Kameleon execution environnement
|
11
14
|
- The *out* context where you will bootstrap the appliance
|
data/docs/source/faq.rst
CHANGED
@@ -2,4 +2,42 @@
|
|
2
2
|
FAQ
|
3
3
|
---
|
4
4
|
|
5
|
-
|
5
|
+
.. note::
|
6
|
+
Work in progress...
|
7
|
+
|
8
|
+
Why my step file is not valid?
|
9
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
10
|
+
When you try to build your recipe, you gat this message::
|
11
|
+
|
12
|
+
[global]: The macrostep /path/to/my/step/step.yaml is not valid
|
13
|
+
|
14
|
+
It means your step is not a valid YAML file. Be sure that you did not use some tabulations
|
15
|
+
instead of spaces or mix dictionnary and list in the same level. It is recommended to (re)read
|
16
|
+
the :doc:`recipe` documentation.
|
17
|
+
|
18
|
+
I have some troubles with qemu-nbd, what should I do?
|
19
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
20
|
+
qemu-nbd is heavily used is some recipes and when the recipe crash it can be left in a
|
21
|
+
bad state. So, when you build you got this::
|
22
|
+
|
23
|
+
qemu-nbd: Failed to bdrv_open ...
|
24
|
+
nbd device /dev/nbd2 is unavailable
|
25
|
+
|
26
|
+
It means the that the ``/dev/ndb2`` device is not available anymore so go to the recipe and
|
27
|
+
change the value of ``nbd_device`` to something else like ``/dev/nbd3``.
|
28
|
+
|
29
|
+
.. note::
|
30
|
+
This is a cleaning problem and this is just a workaround. If you find an way to be clean
|
31
|
+
the nbd device correctly lest us know!
|
32
|
+
|
33
|
+
If the problem persist you can try to reboot your computer or remove the entire build directory.
|
34
|
+
|
35
|
+
What is a *mapping value*?
|
36
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
37
|
+
|
38
|
+
When you write a command and you got this error::
|
39
|
+
|
40
|
+
Error: ... mapping values are not allowed in this context at line 6 column 27
|
41
|
+
|
42
|
+
In YAML the mapping value is a ``:`` character. If you put this in a command the YAML parser
|
43
|
+
will not understand and raise an error. Just put some quotes around your command and that's it!
|
@@ -2,5 +2,231 @@
|
|
2
2
|
Getting Started
|
3
3
|
---------------
|
4
4
|
|
5
|
+
.. note::
|
6
|
+
This page is a work in progress...
|
5
7
|
|
6
|
-
|
8
|
+
Installation
|
9
|
+
~~~~~~~~~~~~
|
10
|
+
|
11
|
+
To install Kameleon have a look at the :doc:`installation` section.
|
12
|
+
|
13
|
+
Create a new recipe from template
|
14
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
15
|
+
|
16
|
+
First thing to know is that Kameleon is an automation tool for bash. It brings
|
17
|
+
the ease of error handling, retry, checkpointing, easy debugging and cleaning
|
18
|
+
to your scripts to help you build your software appliance.
|
19
|
+
|
20
|
+
The template system built-in allows you quickly build a system and to understand the
|
21
|
+
Kameleon basics. Let see the template list::
|
22
|
+
|
23
|
+
kameleon templates
|
24
|
+
|
25
|
+
It shows the templates names and descriptions directly from the templates files shipped
|
26
|
+
with Kameleon::
|
27
|
+
|
28
|
+
The following templates are available in /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates:
|
29
|
+
NAME | DESCRIPTION
|
30
|
+
---------------------|-----------------------------------------------------------
|
31
|
+
fedora-docker | Fedora base image [Work in progress].
|
32
|
+
debian-wheezy-chroot | Build a debian wheezy appliance using chroot and qemu-nbd.
|
33
|
+
debian-wheezy-docker | Build a debian wheezy appliance using Docker.
|
34
|
+
|
35
|
+
Let's pick one of these. The ``debian-wheezy-chroot`` is a good example. Now you
|
36
|
+
will create a new recipe from this template. Let's name it ``debian_test``::
|
37
|
+
|
38
|
+
kameleon new debian_test -t debian-wheezy-chroot
|
39
|
+
|
40
|
+
Kameleon make a direct copy of the YAML template recipe file and all
|
41
|
+
the other required files like steps or aliases ones. You can see that in the
|
42
|
+
``new`` command output::
|
43
|
+
|
44
|
+
[cli]: Cloning template 'debian-wheezy-chroot'
|
45
|
+
[recipe]: Loading /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/debian-wheezy-chroot.yaml
|
46
|
+
[recipe]: Loading aliases /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/aliases/defaults.yaml
|
47
|
+
[recipe]: Loading checkpoint configuration /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/checkpoints/qcow2.yaml
|
48
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/bootstrap/debian/debootstrap.yaml
|
49
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/bootstrap/prepare_appliance_with_nbd.yaml
|
50
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/bootstrap/start_chroot.yaml
|
51
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/setup/debian/software_install.yaml
|
52
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/setup/debian/kernel_install.yaml
|
53
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/setup/debian/system_config.yaml
|
54
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/setup/debian/keyboard_config.yaml
|
55
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/setup/debian/network_config.yaml
|
56
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/setup/create_user.yaml
|
57
|
+
[recipe]: Loading macrostep /var/lib/gems/1.9.1/gems/kameleon-builder-2.0.0/templates/steps/export/save_appliance_from_nbd.yaml
|
58
|
+
[recipe]: Loading recipe metadata
|
59
|
+
[cli]: New recipe "debian_test" as been created in /home/mercierm/kameleon_ws/recipes/debian_test.yaml
|
60
|
+
|
61
|
+
You can check that you got all the files in your workspace for example with the
|
62
|
+
UNIX ``tree`` command::
|
63
|
+
|
64
|
+
tree
|
65
|
+
.
|
66
|
+
`-- recipes
|
67
|
+
|-- aliases
|
68
|
+
| `-- defaults.yaml
|
69
|
+
|-- checkpoints
|
70
|
+
| `-- qcow2.yaml
|
71
|
+
|-- debian_test.yaml
|
72
|
+
`-- steps
|
73
|
+
|-- bootstrap
|
74
|
+
| |-- debian
|
75
|
+
| | `-- debootstrap.yaml
|
76
|
+
| |-- prepare_appliance_with_nbd.yaml
|
77
|
+
| `-- start_chroot.yaml
|
78
|
+
|-- export
|
79
|
+
| `-- save_appliance_from_nbd.yaml
|
80
|
+
`-- setup
|
81
|
+
|-- create_user.yaml
|
82
|
+
`-- debian
|
83
|
+
|-- kernel_install.yaml
|
84
|
+
|-- keyboard_config.yaml
|
85
|
+
|-- network_config.yaml
|
86
|
+
|-- software_install.yaml
|
87
|
+
`-- system_config.yaml
|
88
|
+
|
89
|
+
9 directories, 13 files
|
90
|
+
|
91
|
+
To understand this hierarchy please refer to the :doc:`recipe` documentation.
|
92
|
+
|
93
|
+
Build my new recipe
|
94
|
+
~~~~~~~~~~~~~~~~~~~
|
95
|
+
|
96
|
+
.. note::
|
97
|
+
Be sure to be `root` to run the following steps. It is needed for loading
|
98
|
+
modules, chrooting,...
|
99
|
+
|
100
|
+
There is no magic in Kameleon, everything is written in YAML:
|
101
|
+
from your system bootstrap to its export. It empowers you to customize anything
|
102
|
+
you want at anytime during the appliance build. But before changing anything
|
103
|
+
just build the template to see how it works::
|
104
|
+
|
105
|
+
kameleon build debian_test
|
106
|
+
|
107
|
+
Oups! Maybe you get an error like this::
|
108
|
+
|
109
|
+
...
|
110
|
+
[engine]: qemu-img is missing
|
111
|
+
[engine]: Press [c] to continue with execution
|
112
|
+
[engine]: Press [a] to abort execution
|
113
|
+
[engine]: Press [l] to switch to local_context shell
|
114
|
+
[engine]: Press [o] to switch to out_context shell
|
115
|
+
[engine]: answer ? [c/a/l/o]:
|
116
|
+
|
117
|
+
This is the interactive prompt of Kameleon.
|
118
|
+
It is a powerful tool that offers you the possibility to fix a problem
|
119
|
+
if something goes wrong during the build process.
|
120
|
+
For this example, the problem is due to the missing ``qemu-img`` binary.
|
121
|
+
So you have to install it on your ``out`` context (to read more about context see the
|
122
|
+
:doc:`context` page). Just type the ``o`` key and ``Enter``. Now you are logged
|
123
|
+
in your out context. If you are on a Debian based system install the missing
|
124
|
+
package::
|
125
|
+
|
126
|
+
apt-get install qemu-utils
|
127
|
+
|
128
|
+
Press ``Ctrl-d`` or type ``exit`` to go back to the Kameleon prompt then press
|
129
|
+
``c`` and ``Enter`` to continue the build.
|
130
|
+
|
131
|
+
The first time it will take a while to finish the building process. But, Thanks
|
132
|
+
to the :doc:`checkpoint` mechanism you can abort with ``Ctrl-c`` anytime during
|
133
|
+
the build without problem. Every step is backed up and if you start the
|
134
|
+
build again, it will skip all the steps already done
|
135
|
+
to restart at the point you have just stopped. Moreover, if you change anything in the recipe
|
136
|
+
Kameleon will know it (using recipe and steps hashes), so your next build will
|
137
|
+
automatically restart at the right steps. Here is a good example: The first
|
138
|
+
time you built your recipe you should have something like this::
|
139
|
+
|
140
|
+
...
|
141
|
+
[cli]: Build recipe 'debian_test' is completed !
|
142
|
+
[cli]: Build total duration : 424 secs
|
143
|
+
...
|
144
|
+
|
145
|
+
Now you can run your appliance using qemu::
|
146
|
+
|
147
|
+
qemu-system-x86_64 -enable-kvm builds/debian_test/debian_test.qcow2
|
148
|
+
|
149
|
+
.. note::
|
150
|
+
If you do not have access to a graphical server use the ``-curses`` option
|
151
|
+
|
152
|
+
How to use the checkpoint
|
153
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
154
|
+
|
155
|
+
You just have to run the build again and you will notice that it is much faster::
|
156
|
+
|
157
|
+
kameleon build debian_test
|
158
|
+
...
|
159
|
+
[engine]: Step 1 : bootstrap/_init_bootstrap/_init_0_debootstrap
|
160
|
+
[engine]: ---> fac7c7045b6f
|
161
|
+
[engine]: ---> Using cache
|
162
|
+
...
|
163
|
+
[cli]: Build recipe 'debian_test' is completed !
|
164
|
+
[cli]: Build total duration : 4 secs
|
165
|
+
...
|
166
|
+
|
167
|
+
As you can see Kameleon has used the checkpoint cache for each step and in
|
168
|
+
doing so it takes just 4 seconds to build the recipe again. Well the recipe did
|
169
|
+
not change so there is no real challenge to build it so fast. Let's change
|
170
|
+
the user name for example. Open the ``debian_test.yaml`` recipe file and in the
|
171
|
+
global section change the user name like this::
|
172
|
+
|
173
|
+
user_name: my_user
|
174
|
+
|
175
|
+
Save the file and re-build the recipe again. This is a part of the outputs you
|
176
|
+
should see::
|
177
|
+
|
178
|
+
kameleon build debian_test
|
179
|
+
...
|
180
|
+
[engine]: Step 29 : setup/create_user/create_group
|
181
|
+
[engine]: ---> ad19db198510
|
182
|
+
[engine]: ---> Using cache
|
183
|
+
[engine]: Step 30 : setup/create_user/add_user
|
184
|
+
[engine]: ---> 6bde599e7ed1
|
185
|
+
[engine]: ---> Running step
|
186
|
+
[engine]: ---> Creating checkpoint : 6bde599e7ed1
|
187
|
+
[engine]: Step 31 : setup/create_user/add_group_to_sudoers
|
188
|
+
[engine]: ---> 28b7a1fae5e2
|
189
|
+
[engine]: ---> Running step
|
190
|
+
[engine]: ---> Creating checkpoint : 28b7a1fae5e2
|
191
|
+
...
|
192
|
+
[cli]: Build recipe 'debian_test' is completed !
|
193
|
+
[cli]: Build total duration : 29 secs
|
194
|
+
...
|
195
|
+
|
196
|
+
This need a little explanation: You have change the ``user_name`` value in the
|
197
|
+
recipe. This variable is firstly used in the ``add_user`` :ref:`microstep`, in the
|
198
|
+
create_user :ref:`step` within the setup section. That is why all microsteps
|
199
|
+
before this one (the 30 in our case) are using the cache but all the microsteps after
|
200
|
+
are build again, to prevent side effects of this change, even if they are not
|
201
|
+
using the ``add_user`` value.
|
202
|
+
|
203
|
+
Add a new step
|
204
|
+
~~~~~~~~~~~~~~
|
205
|
+
|
206
|
+
Let's assume that you want to add a step to put a timestamp in your image to
|
207
|
+
know when it was built. First, you have to create a step file in the
|
208
|
+
``steps/setup`` folder because you want your timestamp to be added inside the
|
209
|
+
newly created appliance before exporting it. Let's call it ``add_timestamp.yaml``:
|
210
|
+
|
211
|
+
.. literalinclude:: ../../contrib/steps/setup/add_timestamp.yaml
|
212
|
+
:language: yaml
|
213
|
+
|
214
|
+
Then you should have this step to the recipe at the end of the setup section::
|
215
|
+
|
216
|
+
...
|
217
|
+
setup:
|
218
|
+
...
|
219
|
+
- add_timestamp
|
220
|
+
|
221
|
+
Then build again your recipe and run it like before to see that your timestamp
|
222
|
+
has been truly added.
|
223
|
+
To get more information about steps definition and usage like default
|
224
|
+
variable and microstep selection see :ref:`step`.
|
225
|
+
|
226
|
+
Advanced Features
|
227
|
+
~~~~~~~~~~~~~~~~~
|
228
|
+
|
229
|
+
Kameleon gives you a lot of extension and customization possibilities. You can
|
230
|
+
define you own :doc:`aliases` and even your own :doc:`checkpoint` mechanism. You
|
231
|
+
are invited to go through the rest of the documentation to fully understand
|
232
|
+
Kameleon and it's great possibilities.
|
@@ -0,0 +1,110 @@
|
|
1
|
+
==================
|
2
|
+
Grid'5000 Tutorial
|
3
|
+
==================
|
4
|
+
|
5
|
+
This tutorial will introduce Kameleon a tool to build software appliances that can be
|
6
|
+
deployed on different infrastructures such as: virtualization, cloud computing, baremetal, etc.
|
7
|
+
|
8
|
+
---------------
|
9
|
+
Kameleon basics
|
10
|
+
---------------
|
11
|
+
|
12
|
+
First of all, let's see all the syntax flavors that Kameleon have to offer.
|
13
|
+
From this point, we assume that kameleon have been installed and it's already working
|
14
|
+
in your system, otherwise will refer to[1].
|
15
|
+
Kameleon can be seen as a shell sequencier which will boost your shell scripts.
|
16
|
+
It is based on the execution of shell scripts but it provides some syntax sugar that makes
|
17
|
+
the work with shell scripts less painfull.
|
18
|
+
|
19
|
+
We will start with the basics
|
20
|
+
|
21
|
+
Kameleon Hello world
|
22
|
+
~~~~~~~~~~~~~~~~~~~~
|
23
|
+
|
24
|
+
Everything we want to build have to be specified by a recipe. Kameleon will read this recipe
|
25
|
+
and it will execute the appropiate actions. Let's create a hello world recipe for kameleon.
|
26
|
+
Open a text editor and write the following::
|
27
|
+
|
28
|
+
setup:
|
29
|
+
- first_step:
|
30
|
+
- hello_microstep:
|
31
|
+
- exec_local: echo "Hello world"
|
32
|
+
# The end
|
33
|
+
|
34
|
+
save the privious file as a YAML file. For instance hello_world.yaml.
|
35
|
+
|
36
|
+
.. note::
|
37
|
+
Be sure of respecting the YAML syntax `yaml`_.
|
38
|
+
|
39
|
+
.. _yaml: http://www.yaml.org/
|
40
|
+
|
41
|
+
|
42
|
+
Then, you run it like this::
|
43
|
+
|
44
|
+
kameleon build hello_world.yaml
|
45
|
+
|
46
|
+
You will have some output that looks like this::
|
47
|
+
|
48
|
+
[kameleon]: Starting recipe consistency check
|
49
|
+
[kameleon]: Resolving variables
|
50
|
+
[kameleon]: Calculating microstep identifiers
|
51
|
+
[kameleon]: Creating kameleon working directory : /home/cristian/Repositories/exptools/setup_complex_exp/tests/new_version/build/hello_world
|
52
|
+
[kameleon]: Building local context [local]
|
53
|
+
[kameleon]: Building external context [out]
|
54
|
+
[kameleon]: Building internal context [in]
|
55
|
+
[kameleon]: Starting build recipe 'hello_world.yaml'
|
56
|
+
[kameleon]: Step 1 : setup/first_step/hello_microstep
|
57
|
+
[kameleon]: ---> Running step
|
58
|
+
[kameleon]: Starting process: "bash"
|
59
|
+
[local_ctx]: The local_context has been initialized
|
60
|
+
[local_ctx]: Hello world
|
61
|
+
[kameleon]:
|
62
|
+
[kameleon]: Build recipe 'hello_world.yaml' is completed !
|
63
|
+
[kameleon]: Build total duration : 0 secs
|
64
|
+
[kameleon]: Build directory : /home/cristian/Repositories/exptools/setup_complex_exp/tests/new_version/build/hello_world
|
65
|
+
[kameleon]: Build recipe file : /home/cristian/Repositories/exptools/setup_complex_exp/tests/new_version/build/hello_world/kameleon_build_recipe.yaml
|
66
|
+
[kameleon]: Log file : /home/cristian/Repositories/exptools/setup_complex_exp/tests/new_version/kameleon.log
|
67
|
+
|
68
|
+
With this simple example, we have already introduced most of the Kameleon concepts and syntax.
|
69
|
+
First, how recipes are structured. Which could be done using: sections, steps, microsteps.
|
70
|
+
|
71
|
+
* Sections: The sections correspond to the minimal actions that have to be performed in order to have a software
|
72
|
+
stack that can be run almost anywhere. This brings to Kameleon a high degree of customizability, reuse of
|
73
|
+
code and users have total control in when and where the
|
74
|
+
sections have to take place. This minimal actions are: bootstrap, setup and export.
|
75
|
+
|
76
|
+
* Steps: It refers to a specific action to be done inside a section.
|
77
|
+
Steps can be declared in independent files that improves the degree of reusability.
|
78
|
+
|
79
|
+
* Microsteps: procedures composed of shell commands. The goal of dividing steps into microsteps is the
|
80
|
+
possibility of activating certain actions within a step.
|
81
|
+
|
82
|
+
The Kameleon hierarchy encourages the reuse (shareability) of code and modularity of procedures.
|
83
|
+
|
84
|
+
The minimal building block are the commands exec_ which wraps shell commands adding
|
85
|
+
a simple error handling and interactivenes in case of a problem.
|
86
|
+
These commands are executed in a given context. Which could be: local, in, out.
|
87
|
+
That are going to be defined later. They can be used as follows::
|
88
|
+
|
89
|
+
setup:
|
90
|
+
- first_step:
|
91
|
+
- hello_microstep:
|
92
|
+
- exec_local: echo "Hello world"
|
93
|
+
- exec_in: echo "Hello world"
|
94
|
+
- exec_out: echo "Hello world"
|
95
|
+
# The end
|
96
|
+
|
97
|
+
|
98
|
+
* Local context: It represents the Kameleon execution environment. Normally is the user’s machine.
|
99
|
+
|
100
|
+
* OUT context: It is where the appliance will be bootstraped. Some procedures have to be carried out in
|
101
|
+
order create the place where the software appliance is built (In context).
|
102
|
+
This can be: the same user’s machine using chroot.
|
103
|
+
Thus, in this context is where the setup of the chroot takes place.
|
104
|
+
Establishing the proper environmental variables in order to have a clean environment.
|
105
|
+
Other examples are: setting up a virtual machine, access to an infrastructure in order to get an instance and be able to deploy, setting
|
106
|
+
a Docker container, etc.
|
107
|
+
|
108
|
+
* IN context: It makes reference to inside the newly
|
109
|
+
created appliance. It can be mapped to a chroot,
|
110
|
+
virtual machine, physical machine, Linux container, etc.
|