Welcome to my website. I am always posting links to photo albums, art, technology and other creations. Everything that you will see on my numerous personal sites is powered by the formVistaTM Website Management Engine.


  • Subscribe to this RSS Feed
  • Quick-Start and Minimal Cheat Sheet for Chef and Test Kitchen
    11/16/2015 3:30PM

    Following is a quick-start for getting a Chef and Test Kitchen environment set up to start writing and testing Chef cookbooks.  This is an work in progress, so please if you find something that is incorrect or does not work as expected, send me an e-mail.

    Development Environment Set-up:

    Unless you are a Ruby developer and already have a complete environmenet set-up the easiest thing to do is to install the Chef Development Kit, https://downloads.chef.io/chef-dk/.

    After downloading and installing the package add a CHEF_HOME and RUBY_HOME var pointed to the embedded version of Ruby that comes with the Chef SDK.

      export CHEF_HOME=/opt/chefdk
      export RUBY_HOME=/opt/chefdk/embedded

    Building Cookbooks:

    Generate the cookbook skeleton:

    $ chef generate cookbook <name-of-cookbook>

    Then cd into that directory and initialize the cookbook:

    $ kitchen init --create-gemfile

    You will also want to run bundle install, which will require your user to have sudo permissions.

    $ bundle install

    Run kitchen converge to verify before starting dev.

    $ kitchen converge <name-of-vm>

    Create a recipe

    $ chef generate recipe <name-of-recipe>

    [Optional] To use attributes, first create the attributes directory structure

    $ chef generate attribute default

    Some helpful Tips:

    1.  Answer the following questions for each new cookbook you are going to create.  It will help you focus the purpose of the cookbook:

    . Name
    . Purpose
    . Success criteria
    . App/Service
    . Required steps

    2.  Creating template files:

    $ chef generate template <name-of-file>

        . Sample variable to be added to a template:
          <%= node['hostname'] %>

    3.  Available host variables.  You can see all of the variables available to be used in templates by logging in to a chef managed VM and issuing the following command:

    $ kitchen login <name-of-vm>

    $ ohia | less

    4.  Add a IP to a kitchen VM so that additional kitchen VMs can talk to each other.  Add the following to your .kitchen.yml file.

      - name: centos-7.1
          - ["private_network", {type: "dhcp"}]


      - name: centos-7.1
          - ["private_network", {ip: ""}]

    When specifying an IP, check the vboxnet0 interface on the host machine to see what network the VirtualBox host is configured and pick an IP in that range.

    In my case, I had to make sure that only one machine was configured under 'platform', or that each had a network configuration.

    Also, I had to have 'require_chef_omnibus: true' under the vagrant driver as follows:

      name: vagrant
      require_chef_omnibus: true

    5.  Debugging Attributes:  Using the 'pp' module you can format the output of the node.debug('<attribute-name>').

    Add the following to a recipe, and run it with kitchen converge:

    require 'pp'

    node.default['ipaddress'] = ''
    pp node.debug_value('ipaddress')

  • Perl One-Liner for Replacing Multiple Lines of a Text file With Multiple Lines of Text
    10/27/2015 2:47PM

    When executing 'search-and-replace' commands on ASCII under Linux, Unix (or *nix) operating systems, sed works or most cases and makes for reasonably straightforward reading of the script.

    If  you want to replace multiple lines of text with multiple lines of text, following is a perl one-liner that does the trick and is much easier to wrangle than trying to do it in sed.

    perl -i -pe "BEGIN{undef $/;} s:${EXISTING_LINES}:${REPLACEMENT_TEXT}:smg" file.txt

  • Adding the Contents of a Source File to the Beginning of a Target File
    10/26/2015 4:49PM

    Following is *nix a command that you can use to add the contents of a source text file to the start of another text file (the source file).

    $ echo -e '0r <source_file_name>\nw' | ed -s <target_file_name>

  • Creating a Samba Share and Configuring an Access Control List for a Shared Directory Under Linux
    10/18/2015 5:08AM

    Often administrators would like to configure a Samba share that enables users to have the same access to any files within the share.  Without some additional configuration, directories and files created by one user will not have the r/w permissions for other users that have access to that same share.

    The end goal is to have a Samba share in which any new files are created with r/w permissions for a specific group to which all of the members of the share belong.

    The first step is to determine whether the current running kernel supports ACL.  To do this we check the configuration file that was used to build the kernel, looking for config keys that contain the string 'POSIX_ACL'.

    Determine the version of your current kernel

    # uname -a
    Linux leviathan 2.6.32-358.2.1.el6.x86_64 #1 SMP Wed Mar 13 00:26:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

    Then grep the config file for your kernel

    # grep POSIX_ACL /boot/config-2.6.32-358.2.1.el6.x86_64

    If the configuration for the filesystem type that you are using on the disk on which you want to configure the share indicates 'y', then you can continue to the next step.  If not, you will need to recompile your kernel with ACL support.

    Next, check the configuration entry in /etc/fstab for the filesystem that we want to use.

    /dev/sda1               /usr/local2/            ext3    defaults        1 2

    In this case, our filesystem is not yet configured to use acl as it is not noted after the 'defaults' option.

    Edit /etc/fstab and change that option to read 'defaults,acl' as follows:

    /dev/sda1               /usr/local2/            ext3    defaults,acl        1 2

    Unmount, and then re-mount the filesystem.

    Next, ensure that you already have a group configured for the users in question and that those users belong to that group.  For this example our group will be 'sharegroup'

    Then, create the directory that you want to share via Samba and set the permissins and acl for it.

    # mkdir /usr/local2/share

    Change the group ownership, permissions, and set the sgid flag.

    # chgrp sharegroup /usr/local2/share

    # chmod g+w share

    # chmod g+x share

    # chmod g+s share

    Now we set the acl for the directory.  The following sets the default group to 'sharegroup' with permissions of 'rwx'.

    # setfacl -m d:g:sharegroup:rwx share/

    The last thing to do is to set up the share in Samba.  Edit /etc/samba/smb.conf

            comment =  Shared Directory
            path = /usr/local2/share
            valid users = user1 user2
            browseable = yes
            writeable = yes
            create mask = 2664
            directory mask = 2775

    The key configurations are the create and directory mask which will ensure that files are created with the proper group permissions to enable all of the users the desired access.

    Restart samba and you are finished.

    If you copy an existing directory into the share directory you will need to modify the permissions so that it is available to all of the users who have access to that share.

    Add sgid permissions to all of the sub directories:

    # find ./new_dir -type d -exec chmod g+s {} \;

    Add executable permissions for the group to all of the sub directories:

    # find ./new_dir -type d -exec chmod g+x {} \;

    Add write permissions to all files and directories in the new dir:

    # chmod -R g+w ./new_dir

  • Updating all of the pom.xml Version Numbers in a Multi-Module Maven Project
    10/13/2015 5:05PM

    To update the versions of all of the poms in a multiple module project use the versions-maven plugin.

    To update

    $ mvn versions:set -DnewVersion=1.4.0-SNAPSHOT

    Will modify all of the versions of each of the poms to the version specified.  It will create a pom.xml.versionsBackup for each pom file that it modified.  You can then examine each to make sure that it is as you intended.

    If you want, you can revert your change with

    $ mvn versions:revert

    If you are satisfied with the change, you can commit the change with

    $mvn versions:commit

Advanced Search