Created by gh-md-toc
An application development team needs a new server configured to run their new internal application.
I will use Vagrant
and Virtualbox
(or Kitchen
and Virtualbox
)
to manage a local instance, and the Vagrant
“provision” (or
kitchen converge
) functionality to configure the server.
The application requires the following:
- Nginx as a reverse proxy
- NodeJS
- MemcacheD
- A simple MySQL server
- Host-based firewall configuration (such as iptables or netfilter) so that the application is only accessible from the 10.0.0.0/8 subnet
For the scope of this practice, Nginx, MemcacheD, and MySQL will run on the same host as the application.
- Solution should be implemented in a standard open-source tool chain using commonly available libraries and tools
- Aim to provide a simple but robust solution which others could easily use and extend
- VirtualBox - VirtualBox is a cross-platform virtualization application.
- Vagrant - Vagrant provides easy to configure, reproducible, and portable work environments controlled by a single consistent workflow to help maximize the productivity and flexibility.
- ChefDK - The Chef development kit contains all the tools you need to develop and test your infrastructure, built by the awesome Chef community
The following cookbooks are direct dependencies because they're used for common "default" functionality.
nginx
for installing and configure nginx sites/streamsnodejs
for installing node.js binariesiptables
for configured iptables using custom resources
The following platforms are supported and tested with Test Kitchen:
- Ubuntu 14.04+
- CentOS 7+
Other Debian and RHEL family distributions are assumed to work.
- Chef 14+
Node attributes for this cookbook are logically separated into different files. Some attributes are set only via a specific recipe.
For Sake of this nodeAuto I am using same cookbook to configure multiple apps, but its good practice to seaparete cookbook for individual apps
default['nodeAuto']['node_js']['app'] = {
profile: {
enable: true,
dir: '/opt/app/profile',
dir_mode: 755,
file_mode: 774,
file: 'app.js',
node_env: 'test',
log_dir: '/opt/app/profile/var/log',
log_file: '/opt/app/profile/var/log/app.log',
port: 8080,
host: '127.0.0.1',
message: 'from profile application',
systemd: {
Unit: {
Description: 'Simple Node App of nodeAuto Hello World!',
After: 'network-online.target',
Wants: 'network-online.target',
},
Service: {
ExecStart: node['nodeAuto']['node_js']['bin'] + ' /opt/app/profile/app.js',
ExecStop: '/bin/kill $MAINPID',
KillMode: 'process',
Restart: 'on-failure',
ExecReload: '/bin/kill -HUP $MAINPID',
},
Install: {
WantedBy: 'multi-user.target',
}
}
},
user: {
enable: false,
systemd: {
Service: {
ExecStart: node['nodeAuto']['node_js']['bin'] + ' /opt/app/user/app.js',
}
}
}
}
Note: Always run Kitchen test from cookbook root folder
➜ nodeAuto (master)$ kitchen list
Instance Driver Provisioner Verifier Transport Last Action Last Error
default-ubuntu-1404 Vagrant ChefZero Busser Ssh <Not Created> <None>
default-centos-71 Vagrant ChefZero Busser Ssh <Not Created> <None>
user-ubuntu-1404 Vagrant ChefZero Busser Ssh <Not Created> <None>
user-centos-71 Vagrant ChefZero Busser Ssh <Not Created> <None>
## To Converge particular instance type
➜ nodeAuto (master)$ kitchen converge <Instance Name>
example: kitchen converge default-ubuntu-1404
(or)
## To Converge all configured instance types
<cookbook root folder>$ kitchen converge
## Validate the service
➜ nodeAuto (master)$ while read name;do kitchen exec $name -c 'curl -L http://localhost';done< <(kitchen list -b)
-----> Execute command on default-ubuntu-1404.
Hello World - from profile application running on host:default-ubuntu-1404 over port:8080
-----> Execute command on default-centos-71.
Hello World - from profile application running on host:default-centos-71 over port:8080
-----> Execute command on user-ubuntu-1404.
Hello World - from user application running on host:user-ubuntu-1404 over port:8090
-----> Execute command on user-centos-71.
Hello World - from user application running on host:user-centos-71 over port:8090
Final Converge list: ➜ nodeAuto(master)$ kitchen list -j
[
{
"instance": "default-ubuntu-1404",
"driver": "Vagrant",
"provisioner": "ChefZero",
"verifier": "Busser",
"transport": "Ssh",
"last_action": "converge",
"last_error": null
},
{
"instance": "default-centos-71",
"driver": "Vagrant",
"provisioner": "ChefZero",
"verifier": "Busser",
"transport": "Ssh",
"last_action": "converge",
"last_error": null
},
{
"instance": "user-ubuntu-1404",
"driver": "Vagrant",
"provisioner": "ChefZero",
"verifier": "Busser",
"transport": "Ssh",
"last_action": "converge",
"last_error": null
},
{
"instance": "user-centos-71",
"driver": "Vagrant",
"provisioner": "ChefZero",
"verifier": "Busser",
"transport": "Ssh",
"last_action": "converge",
"last_error": null
}
]