In this post, I will show how to test a CHEF recipe with kitchen-wpar. I will also use the AIX cookbook to make more advanced recipes.

Intro

It’s not happening very often to be able to write a CHEF recipe well on the first try. For example, if you made a typo in your filesystem name and tried it directly on a server you will still need to do a manual cleanup before retrying again. It’s not too troublesome for small recipes but on complex ones it become a real problem. kitchen provision temporary systems to run recipes on it. You have multiple modules to use AWS, vagrant, KVM and so on to choose how to provision it. I made a small module named kitchen-wpar to make possible to test recipes on AIX.

I will start from where I left in my previous post introducing chef on aix. So I already have CHEF client installed on AIX and I am still not using a CHEF server.

Workstation setup

To have a good CHEF development environment it’s recommended to install chefdk. It’s not mandatory here but it’s a good practice. It’s one package containing all dependencies needed to develop CHEF recipes(and other resources). It’s available for multiple platforms(ubuntu/redhat/windows/macos).

Here, I will use an vanilla Ubuntu 16.04 system for my development workstation.

Let’s create a dedicated user for chef development:

useradd -m chefdev

I will use the latest chefdk version available at the time I write this article: 1.1.16. Let’s download the package and install it:

$ wget https://packages.chef.io/files/stable/chefdk/1.1.16/ubuntu/16.04/chefdk_1.1.16-1_amd64.deb
$ apt install ~chefdev/chefdk_1.1.16-1_amd64.deb
apt Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'chefdk' instead of '/home/chefdev/chefdk_1.1.16-1_amd64.deb'
The following NEW packages will be installed:
  chefdk
0 upgraded, 1 newly installed, 0 to remove and 115 not upgraded.
Need to get 0 B/103 MB of archives.
After this operation, 428 MB of additional disk space will be used.
Get:1 /home/chefdev/chefdk_1.1.16-1_amd64.deb chefdk amd64 1.1.16-1 [103 MB]
Selecting previously unselected package chefdk.
(Reading database ... 283855 files and directories currently installed.)
Preparing to unpack .../chefdk_1.1.16-1_amd64.deb ...
Unpacking chefdk (1.1.16-1) ...
Setting up chefdk (1.1.16-1) ...
Thank you for installing Chef Development Kit!

Everything is installed in /opt/chefdk. Let’s add it in the path of chefdev user by adding this line in .bashrc:

export PATH=$PATH:/opt/chefdk/bin

AIX cookbook

From here, we are ready to test recipes but instead of going from scratch, I will use the aix cookbook which add a lot of features to manage AIX with CHEF.

Let’s clone it with git. It’s also possible to download it in archive format from github.

chefdev:~$ git clone https://github.com/chef-cookbooks/aix.git
Cloning into 'aix'...
remote: Counting objects: 1609, done.
remote: Total 1609 (delta 0), reused 0 (delta 0), pack-reused 1609
Receiving objects: 100% (1609/1609), 396.81 KiB | 0 bytes/s, done.
Resolving deltas: 100% (1015/1015), done.
Checking connectivity... done.

Everything is in the aix directory. The next step is to install the gem dependencies:

chefdev:~/aix$ chef exec bundle install
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies...
Using rake 12.0.0
Installing public_suffix 2.0.5
Using artifactory 2.5.1
Installing logify 0.2.0
Using mime-types-data 3.2016.0521
Using multipart-post 2.0.0
Using mixlib-shellout 2.2.7
Using mixlib-versioning 1.1.0
Using thor 0.19.4
Using net-ssh 3.2.0
Using safe_yaml 1.0.4
Installing tomlrb 1.2.3
Using bundler 1.12.5
Using addressable 2.5.0
Using mime-types 3.1
Installing faraday 0.10.1
Using mixlib-install 2.1.9
Using net-scp 1.2.1
Using net-ssh-gateway 1.2.0
Installing chef-api 0.7.0
Using sawyer 0.8.1
Using test-kitchen 1.14.2
Installing stove 4.1.1
Using octokit 4.6.2
Installing kitchen-wpar 0.1.1
Installing community_cookbook_releaser 0.1.2
Bundle complete! 5 Gemfile dependencies, 26 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

Now we have an environment ready to test recipes or improve the AIX cookbook itself :)

kitchen-wpar

kitchen-wpar is a gem I made to be able to test recipes inside a WPAR. My main purpose here was to be able to test application deployment. You cannot test everything inside but it’s pretty handy if you don’t have a PowerVC environment. If you have one, you should check kitchen-powervc from chmod666. It will allow you to test more different configurations.

The kitchen configuration file is named .kitchen.yml. The cookbook includes a default one ready for kitchen-wpar:

---
driver:
  name: wpar
  aix_host: aixlpar2
  aix_user: root
  wpar_address: 10.10.10.10

provisioner:
  name: chef_solo
  chef_solo_path: /opt/chef/bin/chef-solo
  require_chef_omnibus: false

platforms:
  - name: wpar

suites:
  - name: default
    run_list:
      - recipe[aix::default]
    attributes:

At minimum, it’s needed to change this parameters:

  • aix_host is the AIX partition where the WPAR will be created.

  • wpar_address is the IP address used by the WPAR.

If you want to test filesystem creation it’s better to create a rootvg wpar by adding the wpar_rootvg parameter in the driver section:

driver:
  name: wpar
  aix_host: aixlpar2
  aix_user: root
  wpar_address: 10.10.10.10
  wpar_rootvg: "hdisk2"

SSH key authentication needs to be enabled between the workstation and the AIX partition.

To test if everything is working well, it’s better to try to create this test wpar with the command kitchen create:

kitchen create
-----> Starting Kitchen (v1.14.2)
-----> Creating <default-wpar>...
       lswpar: 0960-419 Could not find a workload partition called kitchenwpar.

       Creating workload partition's rootvg. Please wait...

       mkwpar: Creating file systems...
 /
        /admin
        /home
        /opt
        /proc
        /tmp
        /usr
        /var
       Mounting all workload partition file systems.

By default, you will see the full output of the wpar creation. It’s because wpar creation can take minutes and I think it’s better to see what happens.

Note: unfortunately OpenSSH is not immediately available after the wpar creation, it need 30 seconds to be up. So you can have errors when running the full stack command kitchen setup.

At the end of the output, you should see the kitchenwpar started properly:

Verifying workload partition startup.

Name         State  Type  Hostname     Directory           RootVG WPAR
-----------------------------------------------------------------------
kitchenwpar  A      S     kitchenwpar  /wpars/kitchenwpar  yes

Finished creating <default-wpar> (6m27.23s).
-----> Kitchen is finished. (6m27.57s)

It took 6m27 to have it ready on my small test environment.

kitchen login create a login session directly on the lpar.

chefdev@adejoux-VirtualBox:~/aix$ kitchen login
*******************************************************************************
*                                                                             *
*                                                                             *
*  Welcome to AIX Version 7.2!                                                *
*                                                                             *
*                                                                             *
*  Please see the README file in /usr/lpp/bos for information pertinent to    *
*  this release of the AIX Operating System.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
# df
Filesystem    512-blocks      Free %Used    Iused %Iused Mounted on
Global            196608    126384   36%     2597    16% /
/dev/hd4          196608    126384   36%     2597    16% /
Global           3932160    376744   91%    35804    41% /usr
Global           2097152   1044448   51%    29931    21% /opt
/dev/hd11admin      65536     61896    6%      151     3% /admin
/dev/hd1           65536     63768    3%        7     1% /home
/dev/hd3          196608    193312    2%       22     1% /tmp
/dev/hd9var       393216    351008   11%      424     2% /var
Global             65536     63608    3%       28     1% /etc/objrepos/wboot
Global                 -         -    -        -      - /proc

It’s possible to delete the WPAR with kitchen destroy.

To see the status in kitchen, just run kitchen list:

kitchen list
Instance      Driver  Provisioner  Verifier  Transport  Last Action  Last Error
default-wpar  Wpar    ChefSolo     Busser    Ssh        Created      <None>

AIX cookbook

The recipes directory need to be created:

mkdir recipes

The default recipe is named recipes/default.rb. It’s possible to change the name of the recipe to run in the suites section:

suites:
  - name: default
    run_list:
      - recipe[aix::default]

The recipe just needs to be in the recipes directory. Here aix::default means the suite need to use the recipe named default.rb in aix cookbook.

Let’s use some of the resources of the AIX cookbook to write a simple recipe but with a pretty common scenario.

aix_logical_volume 'lvapp' do
  group 'rootvg'
  size   1024
  copies 1
  action :create
end

aix_filesystem '/app' do
  logical 'lvapp'
  size   '1024M'
  action :create
end

mount '/app' do
  device '/dev/lvapp'
  fstype 'jfs2'
end

The AIX cookbook add logical volume and filesystem management. It’s a great improvement on running the command resource to make it manually :) I invite you to check this cookbook to see all resources available in it.

To run this recipe on the test wpar, use kitchen converge:

kitchen converge
-----> Starting Kitchen (v1.14.2)
-----> Converging <default-wpar>...
       Preparing files for transfer
       Preparing dna.json
       Resolving cookbook dependencies with Berkshelf 5.2.0...
       Removing non-cookbook files before transfer
       Preparing solo.rb
       Transferring files to <default-wpar>
       Starting Chef Client, version 12.8.1
       Installing Cookbook Gems:
       Compiling Cookbooks...
       Converging 3 resources
       Recipe: aix::default
         * aix_logical_volume[lvapp] action create
           - Create logical volume 'lvapp' on volume groupe 'rootvg'
         * aix_filesystem[/app] action create
           - Create file system '/app' on logical volume 'lvapp'
         * mount[/app] action mount
           - mount /dev/lvapp to /app

       Running handlers:
       Running handlers complete
       Chef Client finished, 3/3 resources updated in 08 seconds
       Finished converging <default-wpar> (0m47.45s).
-----> Kitchen is finished. (0m47.79s)

It’s copying the cookbook on the test wpar and run the recipe. We see in the log the filesystem is created and mounted properly:

Recipe: aix::default
  * aix_logical_volume[lvapp] action create
    - Create logical volume 'lvapp' on volume groupe 'rootvg'
  * aix_filesystem[/app] action create
    - Create file system '/app' on logical volume 'lvapp'
  * mount[/app] action mount
    - mount /dev/lvapp to /app

The end

I will finish here this article. I hope you will want to test CHEF on AIX. It’s working pretty well. A part I didn’t cover in this article is testing the recipes results. I am thinking about writing an article about ServerSpec testing on AIX. We will see :)