13.16. Building And Deploying CentOS Images

13.16.1. About

Digital Rebar Platform can be used for image creation, as well as image based deployments. This means drp can be used to both create, and then deploy “golden master” images. This guide will walk you through what is required to first build and then deploy a CentOS 7 image using a few items from the global catalog. This guide will start from an already installed endpoint. If you need assistance getting your endpoint installed see Quick Start.

Note

Windows image creation is currently unsupported using this method. Please use a tool like Packer instead.

13.16.2. Expected System State

The following lists the DRP version, content packs, plugins, and bootenvs with their versions expected to already be installed before you begin following this guide.

  • Digital Rebar Platform v4.2.x or higher
  • drp-community-content v4.2.x or higher
  • task-library v4.2.x or higher
  • CentOS 7 bootenv iso uploaded (see Quick Start for more info)

You should be able to successfully provision a machine with CentOS 7 before proceeding.

13.16.3. Step By Step

Log into the web interface by visiting https://<ip_address_of_your_endpoint>:8092/

Next click the Catalog link (on left scroll down to bottom). Find the “Image Builder” and the “Image Deploy” items and select the check boxes for each one. Click on the “Install” button on the top.

Now with the image builder and image deploy content installed an image needs to be created for use in the deploy process. To build an image just run a machine through the image-builder-centos workflow. This workflow will use the centos-7-install stage, it will also add ssh keys if you have the access-keys param defined, next it will install the drp agent, next it creates an image from what was deployed, and prepares it to be managed by cloud-init. Finally the image is uploaded into the drp endpoint before being marked as complete.

To be able to use this image we need to set some params for image-deploy. We need

  • image-deploy/image-file
  • image-deploy/image-os
  • image-deploy/image-type

For the process we just went through the image-os will be “linux” and the image-type will be “tgz”. For the value to use for image-file we can get that from the output of the image-capture task from the image-builder-centos workflow that ran earlier, or we can get it by looking at the web portals file browser. From the web ui click on the “Files” link on the left near the bottom. Next on the right pane you should see an “images” folder. Click it. Next copy the name of the tarball file. For me it is: centos-tarball-20200130-155447-877f710b40.tgz Your file will have different numbers in the name due to time and date stamping. Now for the image-file value: image-deploy/image-file: files/images/centos-tarball-20200130-155447-877f710b40.tgz

Now that we know the values we need to use for the parameters required for a CentOS-7 deployment we are almost ready to deploy our image. We just need a workflow, and to set the params. You have several options when it comes to setting the params. You can either create a profile add the params to the profile then apply the profile to the machine, or you can apply them directly to the machine object it self, or you can do even more advanced things that are beyond the scope of this document. The only thing left to do now is to make a basic workflow to deploy the image.

Click on the Workflows link on the left. Near the top click the Add button. Name your workflow something descriptive, give it a good description, next add the stage “image-deploy”, and “complete”. That is the minimum required to test our setup. Click save. Now you can apply this workflow to a machine that has had the above 3 params defined on it.

13.16.4. Troubleshooting

When doing CentOS image deployments using UEFI I get:

grub2-install: error: /usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist. Please specify --target or --directory.
Traceback (most recent call last):
      File "/tmp/tmpudYdXr/target/curtin/curtin-hooks.py", line 386, in <module>
        main()
      File "/tmp/tmpudYdXr/target/curtin/curtin-hooks.py", line 365, in main
        grub2_install_efi(target)
      File "/tmp/tmpudYdXr/target/curtin/curtin-hooks.py", line 197, in grub2_install_efi
        '--recheck'])
      File "/usr/lib/python2.7/site-packages/curtin/util.py", line 640, in subp
        return subp(*args, **kwargs)
      File "/usr/lib/python2.7/site-packages/curtin/util.py", line 268, in subp
        return _subp(*args, **kwargs)
      File "/usr/lib/python2.7/site-packages/curtin/util.py", line 140, in _subp
        cmd=args)
    curtin.util.ProcessExecutionError: Unexpected error while running command.
    Command: ['unshare', '--fork', '--pid', '--', 'chroot', '/tmp/tmpudYdXr/target', u'grub2-install', u'--target=x86_64-efi', u'--efi-directory', u'/boot/efi', u'--recheck']
    Exit code: 1
    Reason: -
    Stdout: ''
    Stderr: ''
    finish: cmd-install/stage-curthooks/builtin/cmd-curthooks: FAIL: curtin command curthooks
    Unexpected error while running command.
    Command: ['/tmp/tmpudYdXr/target/curtin/curtin-hooks']
    Exit code: 1
    Reason: -
    Stdout: ''
    Stderr: ''

This means you are missing the grub2-efi-x64-modules from the image. Installing the missing package should correct this problem.