37706dc9ead7de4434480f28b39a1b08afdb19d7
[oom/offline-installer.git] / docs / InstallGuide.rst
1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. http://creativecommons.org/licenses/by/4.0
3 .. Copyright 2021 Samsung Electronics Co., Ltd.
4
5 Offline Installer - Installation Guide
6 ======================================
7
8 This document describes offline installation procedure for `OOM ONAP`_, which is done by the ansible based `Offline installer`_.
9
10 Before you begin the installation process you should prepare the offline installation packages. Please refer to the `Build Guide`_ for instructions on how to create them.
11
12 -----
13
14 Part 1. Prerequisites
15 ---------------------
16
17 ONAP platform has certain software requirements - see `Software requirements`_ and minimum hardware recommendations: ``224 GB RAM``, ``112 vCPUs`` and ``160GB`` of storage (see `Hardware requirements`_). The minimum count of nodes should not drop below three - otherwise you may have to do some tweaking to make it work, which is not covered here (there is a pod count limit for a single kubernetes node - you can read more about it in this `discussion <https://lists.onap.org/g/onap-discuss/topic/oom_110_kubernetes_pod/25213556>`_).
18
19 Kubernetes cluster
20 ~~~~~~~~~~~~~~~~~~
21
22 The four nodes/VMs will be running these services:
23
24 - **infra-node**::
25
26     - nexus
27     - nginx proxy
28     - dns
29     - kubernetes-etcd
30     - kubernetes-control-plane
31     - chartmuseum (if using helm v3)
32
33 **NOTE:** kubernetes-* control plane can be colocated directly with k8s nodes and not necessarily on infra node.
34
35 - **kubernetes node 1-3**::
36
37     - kubernetes worker
38
39 You don't need to care about these services now - that is the responsibility of the installer (described below). Just start four VMs as seen in below table (or according to your needs as we hinted above):
40
41 .. _Overview table of the kubernetes cluster:
42
43 Kubernetes cluster overview
44 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
45
46 .. note:: Offline installer leverages `RKE`_ to provision kubernetes cluster. If you'd like to use different k8s installation method please exclude ``rke.yml`` ansible playbook from execution and provide your own.
47
48 =================== ================== ==================== ============== ============ ===============
49 KUBERNETES NODE     OS                 NETWORK              CPU            RAM          STORAGE
50 =================== ================== ==================== ============== ============ ===============
51 **infra-node**      RHEL/CentOS 7.6    ``10.8.8.100/24``    ``8 vCPUs``    ``8 GB``     ``100 GB``
52 **kube-node1**      RHEL/CentOS 7.6    ``10.8.8.101/24``    ``16 vCPUs``   ``56+ GB``   ``100 GB``
53 **kube-node2**      RHEL/CentOS 7.6    ``10.8.8.102/24``    ``16 vCPUs``   ``56+ GB``   ``100 GB``
54 **kube-node3**      RHEL/CentOS 7.6    ``10.8.8.103/24``    ``16 vCPUs``   ``56+ GB``   ``100 GB``
55 SUM                                                         ``56 vCPUs``   ``176+ GB``  ``400 GB``
56 =========================================================== ============== ============ ===============
57
58 As of now, the offline installer supports only **RHEL 7.x** and **CentOS 7.6** distributions, with at least *@core* and *@base* package groups installed including *Mandatory* and *Default* package sets. So, your VMs should be preinstalled with this operating system - the hypervisor and platform can be of your choosing.
59
60 We will expect from now on that you installed four VMs and they are connected to the shared network. All VMs must be reachable from *install-server* (below), which can be the hypervisor, *infra-node* or completely different host. But in either of these cases the *install-server* must be able to connect over ssh to all of these nodes.
61
62 Install-server
63 ~~~~~~~~~~~~~~
64
65 We will use distinct *install-server* and keep it separate from the four-node cluster. But if you wish so, you can use *infra-node* for this goal (if you use the default ``'chroot'`` option of the installer), but in that case double the size of the storage requirement!
66
67 Prerequisites for the *install-server*:
68
69 - packages described in `Build Guide`_
70 - extra ``100 GB`` storage (to have space where to store these packages)
71 - installed ``'chroot'`` and/or ``'docker'`` system commands
72 - network connection to the nodes - especially functioning ssh client
73
74 Our *install-server* will have ip: ``10.8.8.4``.
75
76 **NOTE:** All the subsequent commands below, are executed from within this *install-server*.
77
78 -----
79
80 Part 2. Configuration
81 ---------------------
82
83 All commands and setups described in this chapter *MUST* be run on the *install-server*. It's assumed here that all commands are run as ``root`` which is of course not necessary - you can use a regular user account. The ssh/ansible connection to the nodes will also expect that we are connecting as ``root`` - you need to elevate privileges to be able to install on them. Although it can be achieved by other means (sudo), we decided here to keep instructions simple.
84
85 Installer packages
86 ~~~~~~~~~~~~~~~~~~
87
88 At this point you should have the installer packages already prepared (see `Build Guide`_):
89
90 - sw_package.tar
91 - resources_package.tar
92 - aux_package.tar
93
94 **NOTE:** ``'aux_package.tar'`` is optional and if you don't have use for it, you can ignore it.
95
96 Copy above packages to the ``/data`` directory on the *install-server* and then unpack the ``'sw_package.tar'`` to your home directory:
97
98 ::
99
100     $ mkdir ~/onap-offline-installer
101     $ tar -C ~/onap-offline-installer -xf /data/sw_package.tar
102
103 Application directory
104 ~~~~~~~~~~~~~~~~~~~~~
105
106 Change the current directory to ``'ansible'``::
107
108     $ cd ~/onap-offline-installer/ansible
109
110 You can see multiple files and directories inside - those are the *offline-installer* ansible playbooks.
111
112 If you created the ``'sw_package.tar'`` package according to the *Build Guide* then at least the following files should be present:
113
114 - ``application/application_configuration.yml``
115 - ``inventory/hosts.yml``
116
117 Following paragraphs describe fine-tuning of ``'inventory.yml'`` to reflect your VMs setup and ``'application_configuration.yml'`` to setup the provisioner itself.
118
119 hosts.yml
120 ~~~~~~~~~
121
122 We need to setup the ``'hosts.yml'`` first, the template looks like this::
123
124     ---
125     # This group contains hosts with all resources (binaries, packages, etc.)
126     # in tarball.
127     all:
128       vars:
129         # this key is supposed to be generated during setup.yml playbook execution
130         # change it just when you have better one working for all nodes
131         ansible_ssh_private_key_file: /root/.ssh/offline_ssh_key
132         ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
133
134       children:
135         resources:
136           hosts:
137             resource-host:
138               ansible_host: 10.8.8.5
139
140         # This is group of hosts where nexus, nginx, dns and all other required
141         # services are running.
142         infrastructure:
143           hosts:
144             infrastructure-server:
145               ansible_host: 10.8.8.13
146               #IP used for communication between infra and kubernetes nodes, must be specified.
147               cluster_ip: 10.8.8.13
148
149         # This is group of hosts which are/will be part of Kubernetes cluster.
150         kubernetes:
151           children:
152             # This is a group of hosts containing kubernetes worker nodes.
153             kubernetes-node:
154               hosts:
155                 kubernetes-node-1:
156                   ansible_host: 10.8.8.19
157                   #ip of the node that it uses for communication with k8s cluster.
158                   cluster_ip: 10.8.8.19
159                   # External ip of the node, used for access from outside of the cluster.
160                   # Can be set to some kind of floating or public ip.
161                   # If not set, cluster_ip is used for this purpose.
162                   # external_ip: x.x.x.x
163
164             # Group of hosts containing etcd cluster nodes.
165             # Defaults to infra.
166             kubernetes-etcd:
167               hosts:
168                 infrastructure-server
169
170             # This is a group of hosts that are to be used as kubernetes control plane nodes.
171             # This means they host kubernetes api server, controller manager and scheduler.
172             # This example uses infra for this purpose, however note that any
173             # other host could be used including kubernetes nodes.
174             # cluster_ip needs to be set for hosts used as control planes, external_ip can also be used.
175             kubernetes-control-plane:
176               hosts:
177                 infrastructure-server
178
179         nfs-server:
180           hosts:
181             kubernetes-node-1
182
183 There is some ssh configuration under the ``'vars'`` section - we will deal with ssh setup a little bit later in the `SSH authentication`_.
184
185 First you need to set the ip addresses and add a couple of kubernetes nodes to match your four-node cluster:
186
187 - Under the ``'resource-host'`` set the ``'ansible_host'`` address to the ip of the host where the packages are stored - it must be reachable by ssh from the *install-server* (for ansible to run playbooks on it)  **AND** *infra-node* (to extract resource data from *resource-host* to *infra-node* over ssh). In our scenario the *resource-host* is the same as the *install-server*: ``'10.8.8.4'``
188 - Similarly, set the ``'ansible_host'`` to the address of the *infra-node* under the ``'infrastructure-server'``.
189 - Copy the whole ``'kubernetes-node-1'`` subsection and paste it twice directly after.  Change the numbers to ``'kubernetes-node-2'`` and ``'kubernetes-node-3'`` respectively and fix the addresses in the ``'ansible_host'`` variables again to match *kube-node1*, *kube-node2* and *kube-node3*.
190
191 As you can see, there is another ``'cluster_ip'`` variable for each node - this serve as a designated node address in the kubernetes cluster. Make it the same as the respective ``'ansible_host'``.
192
193 **NOTE:** In our simple setup we have only one interface per node, but that does not need to be a case for some other deployments - especially if we start to deal with a production usage. Basically, an ``'ansible_host'`` is an entry point for the *install-server's* ansible (*offline-installer*), but the kubernetes cluster can be communicating on a separate network to which *install-server* has no access. That is why we have this distinctive variable, so we can tell the installer that there is a different network, where we want to run the kubernetes traffic and what address each node has on such a network.
194
195 After applying all described changes, the ``'hosts.yml'`` should look similar to this::
196
197     ---
198     # This group contains hosts with all resources (binaries, packages, etc.)
199     # in tarball.
200     all:
201       vars:
202         # this key is supposed to be generated during setup.yml playbook execution
203         # change it just when you have better one working for all nodes
204         ansible_ssh_private_key_file: /root/.ssh/offline_ssh_key
205         ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
206
207       children:
208         resources:
209           hosts:
210             resource-host:
211               ansible_host: 10.8.8.4
212
213         # This is group of hosts where nexus, nginx, dns and all other required
214         # services are running.
215         infrastructure:
216           hosts:
217             infrastructure-server:
218               ansible_host: 10.8.8.100
219               #IP used for communication between infra and kubernetes nodes, must be specified.
220               cluster_ip: 10.8.8.100
221
222         # This is group of hosts which are/will be part of Kubernetes cluster.
223         kubernetes:
224           children:
225             # This is a group of hosts containing kubernetes worker nodes.
226             kubernetes-node:
227               hosts:
228                 kubernetes-node-1:
229                   ansible_host: 10.8.8.101
230                   #ip of the node that it uses for communication with k8s cluster.
231                   cluster_ip: 10.8.8.101
232                   # External ip of the node, used for access from outside of the cluster.
233                   # Can be set to some kind of floating or public ip.
234                   # If not set, cluster_ip is used for this purpose.
235                   # external_ip: x.x.x.x
236                 kubernetes-node-2:
237                   ansible_host: 10.8.8.102
238                   #ip of the node that it uses for communication with k8s cluster.
239                   cluster_ip: 10.8.8.102
240                 kubernetes-node-3:
241                   ansible_host: 10.8.8.103
242                   #ip of the node that it uses for communication with k8s cluster.
243                   cluster_ip: 10.8.8.103
244
245             # Group of hosts containing etcd cluster nodes.
246             # Defaults to infra.
247             kubernetes-etcd:
248               hosts:
249                 infrastructure-server
250
251             # This is a group of hosts that are to be used as kubernetes control plane nodes.
252             # This means they host kubernetes api server, controller manager and scheduler.
253             # This example uses infra for this purpose, however note that any
254             # other host could be used including kubernetes nodes.
255             # cluster_ip needs to be set for hosts used as control planes, external_ip can also be used.
256             kubernetes-control-plane:
257               hosts:
258                 infrastructure-server
259
260         nfs-server:
261           hosts:
262             kubernetes-node-1
263
264 application_configuration.yml
265 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
266
267 Here, we will be interested in the following variables:
268
269 - ``resources_dir``
270 - ``resources_filename``
271 - ``aux_resources_filename``
272 - ``app_data_path``
273 - ``aux_data_path``
274 - ``app_name``
275 - ``timesync``
276
277 ``'resource_dir'``, ``'resources_filename'`` and ``'aux_resources_filename'`` must correspond to the file paths on the *resource-host* (``'resource-host'`` in ``hosts.yml``), which in our case is the *install-server* host.
278
279 The ``'resource_dir'`` should be set to ``'/data'``, ``'resources_filename'`` to ``'resources_package.tar'`` and ``'aux_resources_filename'`` to ``'aux_package.tar'``. The values should be the same as are in the `Installer packages`_ section.
280
281 ``'app_data_path'`` is the absolute path on the *infra-node* to where the package ``'resources_package.tar'`` will be extracted and similarly ``'aux_data_path'`` is another absolute path for ``'aux_package.tar'``. Both paths are fully arbitrary, but they should point to the filesystem with enough disk space - the storage requirements are described in `Overview table of the kubernetes cluster`_.
282
283 **NOTE:** As we mentioned in `Installer packages`_ - the auxiliary package is not mandatory and we will not utilize it in here either.
284
285 The ``'app_name'`` variable should be short and descriptive. We will set it simply to ``onap``.
286
287 The ``'timesync'`` variable is optional and controls synchronisation of the system clock on hosts. It should be configured only if a custom NTP server is available and needed. Such a time authority should be on a host reachable from all installation nodes. If this setting is not provided then the default behavior is to setup NTP daemon on infra-node and sync all kube-nodes' time with it.
288
289 If you wish to provide your own NTP servers configure their IPs as follows::
290
291     timesync:
292       servers:
293        - <ip address of NTP_1>
294        - <...>
295        - <ip address of NTP_N>
296
297 Another time adjustment related variables are ``'timesync.slewclock'`` and ``'timesync.timezone'`` .
298 First one can have value of ``'true'`` or ``'false'`` (default). It controls whether (in case of big time difference compared to server) time should be adjusted gradually by slowing down or speeding up the clock as required (``'true'``) or in one step (``'false'``)::
299
300     timesync:
301       slewclock: true
302
303 Second one controls time zone setting on host. It's value should be time zone name according to tz database names with ``'Universal'`` being the default one::
304
305     timesync.
306       timezone: UTC
307
308 ``'timesync.servers'``, ``'timesync.slewclock'`` and ``'timesync.timezone'`` settings can be used independently.
309
310 Final configuration can resemble the following::
311
312     resources_dir: /data
313     resources_filename: resources_package.tar
314     app_data_path: /opt/onap
315     app_name: onap
316     timesync:
317       servers:
318         - 192.168.0.1
319         - 192.168.0.2
320       slewclock: true
321       timezone: UTC
322
323 Helm chart values overrides
324 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
325
326 OOM charts are coming with all ONAP components disabled, this setting is also prepackaged within our sw_package.tar. Luckily there are multiple ways supported how to override this setting. It's also necessary for setting-up VIM specific entries and basically to configure any stuff with non default values.
327
328 First option is to use ``overrides`` key in ``application_configuration.yml``.
329 These settings will override helm values originally stored in ``values.yaml`` files in helm chart directories.
330
331 For example, the following lines could be appended to ``application_configuration.yml`` to set up managed openstack credentials for onap's so component::
332
333     overrides:
334       so:
335         config:
336           openStackUserName: "os_user"
337           openStackRegion: "region_name"
338           openStackKeyStoneUrl: "keystone_url"
339           openStackEncryptedPasswordHere: "encrypted_password"
340
341 In addition or alternatively to that one can configure ``helm_override_files`` variable in ``'application_configuration.yml'`` and mention all files with helm chart values there, e.g.:
342
343 ::
344
345   helm_override_files:
346     - "/path/to/values1.yaml"
347     - "/path/to/values2.yaml"
348
349 SSH authentication
350 ~~~~~~~~~~~~~~~~~~
351
352 Finally you need to setup password-less login from *install-server* to the nodes.
353
354 You can use the ansible playbook ``'setup.yml'`` for that purpose::
355
356     $ ./run_playbook.sh -i inventory/hosts.yml setup.yml -u root --ask-pass
357
358 You will be asked for password per each node and the playbook will generate a unprotected ssh key-pair ``'~/.ssh/offline_ssh_key'``, which will be distributed to the nodes.
359
360 Another option is to generate a ssh key-pair manually. We strongly advise you to protect it with a passphrase, but for simplicity we will showcase generating of a private key without any such protection::
361
362     $ ssh-keygen -N "" -f ~/.ssh/identity
363
364 The next step will be to distribute the public key to these nodes and from that point no password is needed::
365
366     $ for ip in 100 101 102 103 ; do ssh-copy-id -i ~/.ssh/identity.pub root@10.8.8.${ip} ; done
367
368 This command behaves almost identically to the ``'setup.yml'`` playbook.
369
370 If you generated the ssh key manually then you can now run the ``'setup.yml'`` playbook like this and achieve the same result as in the first execution::
371
372     $ ./run_playbook.sh -i inventory/hosts.yml setup.yml
373
374 This time it should not ask you for any password - of course this is very redundant, because you just distributed two ssh keys for no good reason.
375
376 We can finally edit and finish the configuration of the ``'hosts.yml'``:
377
378 - if you used the ``'setup.yml'`` playbook then you can just leave this line as it is::
379
380     ansible_ssh_private_key_file: /root/.ssh/offline_ssh_key
381
382 - if you created a ssh key manually then change it like this::
383
384     ansible_ssh_private_key_file: /root/.ssh/identity
385
386 -----
387
388 Part 3. Installation
389 --------------------
390
391 We should have the configuration complete and be ready to start the installation. The installation is done via ansible playbooks, which are run either inside a **chroot** environment (default) or from the **docker** container. If for some reason you want to run playbooks from the docker instead of chroot then you cannot use *infra-node* or any other *kube-node* as the *install-server* - otherwise you risk that installation will fail due to restarting of the docker service.
392
393 ``'sw_package.tar'`` should contain ``'ansible_chroot.tgz'`` file inside the ``'docker'`` directory. Detailed instructions on how to create it manually and to get more info about the scripts dealing with docker and chroot, go to `Appendix 1. Ansible execution/bootstrap`_.
394
395 We will use the default chroot option so we don't need any docker service to be running.
396
397 Commence the installation process by running following command::
398
399     $ ./run_playbook.sh -i inventory/hosts.yml -e @application/application_configuration.yml site.yml
400
401 This will take a while so be patient. The whole provisioning process is idempotent so you may safely re-run it if required.
402
403 ``'site.yml'`` playbook will run following playbooks in the given order::
404
405 - ``resources.yml``
406 - ``infrastructure.yml``
407 - ``rke.yml``
408 - ``application.yml``
409
410 ----
411
412 Part 4. Post-installation and troubleshooting
413 ---------------------------------------------
414
415 After all of the playbooks are run successfully the ONAP kubernetes application will be still deploying and it might take some time until all pods are up and running. You can monitor your newly created kubernetes cluster with this command::
416
417     $ ssh -i ~/.ssh/offline_ssh_key root@10.8.8.100 # tailor this command to connect to your infra-node
418     $ watch -d -n 5 'kubectl get pods --all-namespaces'
419
420 Alternatively you can monitor progress with ``helm_deployment_status.py`` script located in offline-installer directory. Transfer it to infra-node and run::
421
422     $ python helm_deployment_status.py -n <namespace_name> # namespace defaults to onap
423
424 To automatically verify functionality with healthchecks after deployment becomes ready or after timeout period expires, append ``-hp`` switch followed by the full path to the healthcheck script and ``--health-mode`` optional switch with appropriate mode supported by that script (``health`` by default, ``--help`` displays available modes)::
425
426     $ python helm_deployment_status.py -hp <app_data_path>/<app_name>/helm_charts/robot/ete-k8s.sh --health-mode <healthcheck mode>
427
428 It is strongly recommended to tailor ``helm_deployment_status.py`` to your needs since default values might not be what you'd expect. The defaults can be displayed with ``--help`` switch.
429
430 Final result of installation varies based on number of k8s nodes used and distribution of pods. In successful deployments all jobs should be in successful state. This can be verified with:
431
432 ::
433
434     $ kubectl get jobs -n <namespace>
435
436 If some of the job is hanging in some wrong end-state like ``'BackoffLimitExceeded'`` manual intervention is required to heal this and make also dependent jobs passing. More details about particular job state can be obtained using ::
437
438     $ kubectl describe job -n <namespace> <job_name>
439
440 If manual intervention is required, one can remove failing job and retry helm install command directly, which will not launch full deployment but rather check current state of the system and rebuild parts which are not up & running. Exact commands are as follows ::
441
442     $ kubectl delete job -n <namespace> <job_name>
443     $ helm deploy <env_name> <helm_chart_name> --namespace <namespace_name>
444
445     E.g. helm deploy dev local/onap --namespace onap
446
447 Once all pods are properly deployed and in running state, one can verify functionality e.g. by running onap healthchecks ::
448
449     $ cd <app_data_path>/<app_name>/helm_charts/robot
450     $ ./ete-k8s.sh onap health
451
452 You can install ``screen`` and ``jq`` packages to aid troubleshooting. Those can be installed from resources directory.
453
454 Screen is a terminal multiplexer and allows running multiple virtual terminal sessions as well as keep active SSH connections even when terminal is closed.
455
456 Jq can be used for editing json data format as output of kubectl. For example jq was used to troubleshoot `SDNC-739 (UEB - Listener in Crashloopback) <https://jira.onap.org/browse/SDNC-739/>`_ ::
457
458     $ kubectl -n onap get job onap-sdc-sdc-be-config-backend -o json | jq "del(.spec.selector)" | jq "del(.spec.template.metadata.labels)" | kubectl -n onap replace --force -f -
459
460 -----
461
462 Appendix 1. Ansible execution/bootstrap
463 ---------------------------------------
464
465 There are two ways how to easily run the installer's ansible playbooks:
466
467 - If you already have or can install a docker then you can build the provided ``'Dockerfile'`` for the ansible and run playbooks in the docker container.
468 - Another way to deploy ansible is via chroot environment which is bundled together within this directory.
469
470 (Re)build docker image and/or chroot archive
471 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
472
473 Inside the ``'docker'`` directory is the ``'Dockerfile'`` and ``'build_ansible_image.sh'`` script. You can run ``'build_ansible_image.sh'`` script on some machine with the internet connectivity and it will download all required packages needed for building the ansible docker image and for exporting it into a flat chroot environment.
474
475 Built image is exported into ``'ansible_chroot.tgz'`` archive in the same (``'docker'``) directory.
476
477 This script has two optional arguments:
478
479 #. ansible version
480 #. docker image name
481
482 **Note:** if optional arguments are not used, docker image name will be set to ``'ansible'`` by default.
483
484 Launching ansible playbook using chroot environment
485 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
486
487 This is the default and preferred way of running ansible playbooks in an offline environment as there is no dependency on docker to be installed on the system. Chroot environment is already provided by included archive ``'ansible_chroot.tgz'``.
488
489 It should be available in the ``'docker'`` directory as the end-result of the packaging script or after manual run of the ``'build_ansible_image.sh'`` script referenced above.
490
491 All playbooks can be executed via ``'./run_playbook.sh'`` wrapper script.
492
493 To get more info about the way how the ``'./run_playbook.sh'`` wrapper script should be used, run::
494
495     $ ./run_playbook.sh
496
497 The main purpose of this wrapper script is to provide the ansible framework to a machine where it was bootstrapped without need of installing additional packages. The user can run this to display ``'ansible-playbook'`` command help::
498
499     $ ./run_playbook.sh --help
500
501 Developers notes
502 ~~~~~~~~~~~~~~~~
503
504 * There are two scripts which work in tandem for creating and running chroot
505 * First one can convert docker image into chroot directory
506 * Second script will automate chrooting (necessary steps for chroot to work and cleanup)
507 * Both of them have help - just run::
508
509     $ cd docker
510     $ ./create_docker_chroot.sh help
511     $ ./run_chroot.sh help
512
513 Example usage::
514
515     $ sudo su
516     $ docker/create_docker_chroot.sh convert some_docker_image ./new_name_for_chroot
517     $ cat ./new_name_for_chroot/README.md
518     $ docker/run_chroot.sh execute ./new_name_for_chroot cat /etc/os-release 2>/dev/null
519
520 Launching ansible playbook using docker container (ALTERNATIVE APPROACH)
521 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
522
523 This option is here just to keep support for the older method which relies on a running docker service. For the offline deployment use the chroot option as indicated above.
524
525 You will not need ``'ansible_chroot.tgz'`` archive anymore, but the new requirement is a prebuilt docker image of ansible (based on the provided ``'Dockerfile'``). It should be available in your local docker repository (otherwise the default name ``'ansible'`` may fetch unwanted image from default registry!).
526
527 To trigger this functionality and to run ``'ansible-playbook'`` inside a docker container instead of the chroot environment, you must first set the ``ANSIBLE_DOCKER_IMAGE`` variable. The value must be a name of the built ansible docker image.
528
529 Usage is basically the same as with the default chroot way - the only difference is the existence of the environment variable::
530
531     $ ANSIBLE_DOCKER_IMAGE=ansible ./run_playbook.sh --help
532
533 -----
534
535 .. _Build Guide: ./BuildGuide.rst
536 .. _Software requirements: https://docs.onap.org/projects/onap-oom/en/latest/oom_cloud_setup_guide.html#software-requirements
537 .. _Hardware requirements: https://docs.onap.org/projects/onap-oom/en/latest/oom_cloud_setup_guide.html#minimum-hardware-configuration
538 .. _OOM ONAP: https://docs.onap.org/projects/onap-oom/en/latest/index.html
539 .. _Offline installer: https://gerrit.onap.org/r/q/oom/offline-installer
540 .. _RKE: https://rancher.com/products/rke/