Now let's make the provisioning a bit more interesting and install actual software in it.
Prepare new Vagrant project
For this article I copied the project created from the previous blog. I called it ol75_db12c, since the goal is database 12c. But we'll also add java.Now edit the Vagrantfile, since we want a new VM with another name:
So adapt the VM_NAME variable to something like "OL75U5_DB12c". You see how convenient it is to have those properties set as a global variable?
You could already try to do vagrant up to try it out. Remember, you can just do vagrant destroy to recreate it.
Also remove (or don't copy) the .vagrant subfolder, otherwise Vagrant would probably assume the box is already provisioned. If that is the case, then either do a vagrant destroy to destroy the VM altogether, or vagrant provision to just re-provision the box.
Java
In the copied project, lets start with Java. There are several possibilities to install java, you could download the RPM from OTN. But one of the recommended practice I found in installing Java on a server is to put it in a path that hasn't got the java version (especially the update) in it. When using it to install Weblogic, for instance, this path ends up in several places in scripts. Although it's a handfull, it's more than once.Upgrading java is then just bringing down the servers/services using it, backup the version and unzip/untar the new version in the same folder. And there you have it: I like a java distribution that comes in an archive.
In Oracle Support you can find it by searching for the document All Java SE Downloads on MOS (Doc ID 1439822.1). There you find the current versions of the Java SE pacakges. For this article I used the public version JDK 8 Update 172, that you can download as patch 27412872:
This contains the rpm as well as a .tar.gz package, that we'll use. Make sure that you download the x86_64 version:
And copy the download in the Stages folder in your vagrant main project folder (see previous blog).
To install it, I have the following script installJava.sh:
#!/bin/bash # #Download a zip with tar.gz containing complete JDK #On MOS: Search for Doc ID 1439822.1 #Download latest 1.8 (public) patch, eg.: #27412872 Oracle JDK 8 Update 172 (complete JDK, incl. jmc, jvisualvm) # SCRIPTPATH=$(dirname $0) # . $SCRIPTPATH/fmw12c_env.sh # TMP_DIR=/tmp STAGE_HOME=/media/sf_Stage EXTRACT_HOME=$STAGE_HOME/Extracted JAVA_ZIP_HOME=$STAGE_HOME/Java JAVA_INSTALL_HOME=$EXTRACT_HOME/Java JAVA_INSTALL_TMP=$EXTRACT_HOME/jdk JAVA_INSTALL_ZIP=p27412872_180172_Linux-x86-64.zip JAVA_INSTALL_TAR=jdk-8u172-linux-x64.tar.gz JAVA_INSTALL_NAME=jdk1.8.0_172 # echo "Checking Java Home: "$JAVA_HOME if [ ! -f "$JAVA_HOME/bin/java" ]; then # #Unzip Java if [ ! -f "$JAVA_INSTALL_HOME/$JAVA_INSTALL_TAR" ]; then if [ -f "$JAVA_ZIP_HOME/$JAVA_INSTALL_ZIP" ]; then echo Unzip $JAVA_ZIP_HOME/$JAVA_INSTALL_ZIP to $JAVA_INSTALL_HOME/$JAVA_INSTALL_TAR mkdir -p $JAVA_INSTALL_HOME unzip -o $JAVA_ZIP_HOME/$JAVA_INSTALL_ZIP -d $JAVA_INSTALL_HOME else echo JAVA Zip File $JAVA_ZIP_HOME/$JAVA_INSTALL_ZIP does not exist! fi else echo $JAVA_INSTALL_TAR already unzipped fi # Install jdk echo Install jdk echo create folder $JAVA_INSTALL_TMP mkdir -p $JAVA_INSTALL_TMP echo create JAVA_HOME $JAVA_HOME mkdir -p $JAVA_HOME echo Untar $JAVA_ZIP_HOME/$JAVA_INSTALL_TAR to $JAVA_INSTALL_TMP tar -xf $JAVA_INSTALL_HOME/$JAVA_INSTALL_TAR -C $JAVA_INSTALL_TMP echo Move $JAVA_INSTALL_TMP/$JAVA_INSTALL_NAME/* to $JAVA_HOME mv $JAVA_INSTALL_TMP/$JAVA_INSTALL_NAME/* $JAVA_HOME #cp -R $JAVA_INSTALL_RPM/* $JAVA_HOME #sudo rpm -ihv $JAVA_INSTALL_HOME/$JAVA_INSTALL_RPM else echo jdk 1.8 already installed fi
That uses the fmw12c_env.sh script:
#!/bin/bash echo set Fusion MiddleWare 12cR2 environment export ORACLE_BASE=/app/oracle export INVENTORY_DIRECTORY=/app/oraInventory export JAVA_HOME=$ORACLE_BASE/product/jdk
The script checks java already exists. If not then it checks if the tar or zip file exist in /media/sf_Stage/Java. If the tar file does not exist it will unzip the zip file. If the tar file does exist, then it will create a temp folder to extract the tar file into. Then it will create the java-home folder and move the extracted jdk folder to it.
I put these files in the scripts/fmw folder of my project:
Call script from provisioning
Now we're at the point that took me a lot of time to figure out last winter. How do I call this scripts form the provisioning. Simple question, but let me try to explain the difficulty.The provisioning is done using the vagrant user. The vagrant user is in the sudoers list, so it's able to run a script using the permissions of another user, usually the super user (root). But it is still the running vagrant user who owns the resulting files and folders. I could do something like sudo su - oracle -c "script"... However, it still results in all the files owned by vagrant. So, if I run the Java install script, the complete java tree is owned by vagrant. But I want oracle to own it. Now, I could create another base box and replace vagrant by oracle as the install user. But that is not the idea.
It took me some time to finally find the great utility runuser. This allows me to run the script as another substitute user. The runuser utility must be run as root, but that's no problem since vagrant is in the sudoers list.
So add the following lines to your provisioning part of the Vagrantfile:
echo _______________________________________________________________________________ echo 3. Java SDK 8 sudo runuser -l oracle -c '/vagrant/scripts/fmw/installJava.sh'
With the -l argument I denote the user and with -c the command to run.
First try
Having done that, you could do a first try of the provisioning by upping the box.Open a command window and start it the first time with vagrant up. Then if all goes well the provisioning ends with:
darwin: _______________________________________________________________________________ darwin: 3. Java SDK 8 darwin: set Fusion MiddleWare 12cR2 environment darwin: Checking Java Home: /app/oracle/product/jdk darwin: Unzip /media/sf_Stage/Java/p27412872_180172_Linux-x86-64.zip to /media/sf_Stage/Extracted/Java/jdk-8u172-linux-x64.tar.gz darwin: Archive: /media/sf_Stage/Java/p27412872_180172_Linux-x86-64.zip darwin: inflating: /media/sf_Stage/Extracted/Java/jdk-8u172-linux-x64.rpm darwin: inflating: /media/sf_Stage/Extracted/Java/jdk-8u172-linux-x64.tar.gz darwin: inflating: /media/sf_Stage/Extracted/Java/readme.txt darwin: Install jdk darwin: create folder /media/sf_Stage/Extracted/jdk darwin: create JAVA_HOME /app/oracle/product/jdk darwin: Untar /media/sf_Stage/Java/jdk-8u172-linux-x64.tar.gz to /media/sf_Stage/Extracted/jdk darwin: tar: jdk1.8.0_172/bin/ControlPanel: Cannot create symlink to `jcontrol': Protocol error darwin: tar: jdk1.8.0_172/man/ja: Cannot create symlink to `ja_JP.UTF-8': Protocol error darwin: tar: jdk1.8.0_172/jre/bin/ControlPanel: Cannot create symlink to `jcontrol': Protocol error darwin: tar: jdk1.8.0_172/jre/lib/amd64/server/libjsig.so: Cannot create symlink to `../libjsig.so': Protocol error darwin: tar: Exiting with failure status due to previous errors darwin: Move /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/bin /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/COPYRIGHT /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/db /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/include /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/javafx-src.zip /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/jre /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/lib /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/LICENSE /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/man /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/README.html /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/release /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/src.zip /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/THIRDPARTYLICENSEREADME-JAVAFX.txt /media/sf_Stage/Extracted/jdk/jdk1.8.0_172/THIRDPARTYLICENSEREADME.txt to /app/oracle/product/jdk
It it all went well you can just destroy it:
d:\Projects\vagrant\ol75_db12c>vagrant destroy darwin: Are you sure you want to destroy the 'darwin' VM? [y/N] y ==> darwin: Forcing shutdown of VM... ==> darwin: Destroying VM and associated drives... d:\Projects\vagrant\ol75_db12c>
Install database
Installing the database is a bit more complex. I'll not post every file, the code can be found here in github, as in fact the rest of my project files.It expects the database installation as two zip files, V46095-01_2of2.zip and V46095-01_1of2.zip in the folder /media/sf_Stage/DBInstallation/12.1.0.2/x86_64/Zipped. Like for the rest it works much like my earlier install Fusion Middleware scripts. It unzips the files, installs the database based on the template response files. And it runs the database creation utility.
I also added scripts to install/unzip sqldeveloper and sql commandline.
To install the database and possibly SQLDeveloper and/or SQLcl, just add the following lines to your vagrant file:
echo _______________________________________________________________________________ echo 4. Database 12c sudo runuser -l oracle -c '/vagrant/scripts/database/installDB.sh' echo _______________________________________________________________________________ echo 5.1 SQLCL and SQLDeveloper sudo runuser -l oracle -c '/vagrant/scripts/database/installSqlcl.sh' echo _______________________________________________________________________________ echo 5.2 SQLDeveloper sudo runuser -l oracle -c '/vagrant/scripts/database/installSqlDeveloper.sh'
And run vagrant up again.
Conclusion
I didn't get much into the install of the database. I feel that I wrote quite a lot in the past on installing Oracle software. In the upcoming period I'll wrap these lasts blogs into a presentation on creating boxes with Vagrant. This an input to my talk on this subject at the NLOUG Tech Experience 2018.By now you should be able to replicate my findings and create other boxes as well. In the next blogs I might write about transforming my other FMW install scripts into vagrant project. We should now be able to create Vagrant projects to install OSB, SOA/BPM Suite, SOA/BPM Quickstart, etc.
Lately I did a Docker install in an Ubuntu 16 base box. Ubuntu has some peculiarities in creating users and logical volume management as opposed to RedHat/Oracle Linux. I might also write about that. But feel free to leave a comment if you have particular wishes. However, please have a bit of patience with me, since I first need to get my talk on the Tech Experience ready.