Daniel Farrell
Software Engineer, Red Hat SDN Team
[~/sandbox]$ vagrant init -m centos/7
[~/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "centos/7"
end
[~/sandbox]$ vagrant up
[~/sandbox]$ vagrant ssh
[vagrant@localhost ~]$
[vagrant@localhost ~]$ curl -o distribution-karaf-0.3.0-Lithium.tar.gz \
<long tarball URL>
[vagrant@localhost ~]$ sudo mkdir /opt/opendaylight
[vagrant@localhost ~]$ sudo tar -x
--strip-components=1
--directory=/opt/opendaylight
-f <long tarball name>
[vagrant@localhost ~]$ sudo /opt/opendaylight/bin/karaf server
karaf: java command not found
[vagrant@localhost ~]$ sudo yum install -y java
vagrant@localhost ~]$ sudo /opt/opendaylight/bin/karaf server &
[vagrant@localhost bin]$ ps -u -p `pgrep java` | awk {'print $1'}
root
[opendaylight-3-candidate]
name=CentOS CBS OpenDaylight Lithium candidate repository
baseurl=http://cbs.centos.org/repos/nfv7-opendaylight-3-candidate/$basearch/os/
enabled=1
gpgcheck=0
[~]$ sudo curl -o /etc/yum.repos.d/opendaylight-3-candidate.repo \
<URL to repo config>
[~]$ sudo yum install -y opendaylight
<snip>
Installed:
opendaylight.noarch 0:3.0.0-2.el7
Complete!
[~]$ sudo systemctl start opendaylight
[~]$ sudo systemctl is-active opendaylight
active
[/opt/opendaylight/bin]$ ./client
<snip>
opendaylight-user@root>feature:install ...
We work to make contributing easy.
class { 'opendaylight':
install_method => 'tarball',
tarball_url => '<URL to your custom tarball>',
unitfile_url => '<URL to your custom unitfile>',
}
[~]$ less genesis/puppet/opnfv/manifests/network.pp
<snip>
class { "opendaylight":
features => [<OPNFV's Karaf features>],
}
<snip>
[~/puppet-opendaylight]$ bundle exec rake test
---> syntax:manifests
---> syntax:templates
---> syntax:hiera:yaml
Finished in 14.14 seconds (files took 0.53374 seconds to load)
537 examples, 0 failures
Total resources: 17
Touched resources: 17
Resource coverage: 100.00%
metadata-json-lint metadata.json
Bringing machine 'centos-7' up with 'virtualbox' provider...
centos-7 12:45:09$ yum install -y puppet
centos-7 12:45:46$ puppet apply <test manifest>
centos-7 12:49:37$ /bin/sh -c systemctl\ is-active\ opendaylight
active
centos-7 executed in 0.04 seconds
should be running
centos-7 12:49:37$ /bin/sh -c id\ odl
uid=1001(odl) gid=1001(odl) groups=1001(odl)
centos-7 executed in 0.04 seconds
should exist
centos-7 executed in 0.05 seconds
should match /^featuresBoot=standard,ssh/
Finished in 5 minutes 22 seconds (files took 1 minute 10.87 seconds to load)
51 examples, 0 failures
# Box that installs ODL via Puppet RPM method on CentOS 7
config.vm.define "cent7_pup_rpm" do |cent7_pup_rpm|
# Build Vagrant box based on CentOS 7
cent7_pup_rpm.vm.box = "boxcutter/centos71"
# Add EPEL repo for access to Puppet et al
cent7_pup_rpm.vm.provision "shell", inline: "yum install -y epel-release"
# Install Puppet
cent7_pup_rpm.vm.provision "shell", inline: "yum install -y puppet"
# Install OpenDaylight using its Puppet module
cent7_pup_rpm.vm.provision "puppet" do |puppet|
puppet.module_path = ["modules"]
puppet.manifest_file = "odl_install.pp"
end
end
# Install OpenDaylight using its Puppet module
cent7_pup_rpm.vm.provision "puppet" do |puppet|
puppet.module_path = ["modules"]
puppet.manifest_file = "odl_install.pp"
end
puppet.module_path = ["modules"]
[~/vagrant-opendaylight]$ librarian-puppet install
[~/vagrant-opendaylight]$ ls modules
archive java opendaylight stdlib
[~/vagrant-opendaylight]$ cat Puppetfile
#!/usr/bin/env ruby
forge "https://forgeapi.puppetlabs.com"
mod 'dfarrell07-opendaylight',
:git => 'git://github.com/dfarrell07/puppet-opendaylight.git',
:ref => 'origin/master'
puppet.manifest_file = "odl_install.pp"
[~/vagrant-opendaylight]$ cat manifests/odl_install.pp
class { 'opendaylight':
extra_features => ['odl-ovsdb-openstack'],
}
[~/vagrant-opendaylight]$ vagrant up cent7_pup_rpm
Notice: /Stage[main]/Opendaylight::Install/Yumrepo[opendaylight]/ensure: created
Notice: /Stage[main]/Opendaylight::Install/Package[opendaylight]/ensure: created
/Stage[main]/Opendaylight::Config/File[org.apache.karaf.features.cfg]/content: content changed '<hash>' to '<different hash>'
[~/vagrant-opendaylight]$ vagrant ssh cent7_pup_rpm
[vagrant@localhost ~]$
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost ~]$ /vagrant/scripts/connect.sh
opendaylight-user@root>config:list | grep featuresBoot\ =
featuresBoot = <default features>,odl-ovsdb-openstack
opendaylight-user@root>feature:list | grep odl-ovsdb-openstack
odl-ovsdb-openstack | 1.1.0-Lithium | x | ovsdb-1.1.0-Lithium <snip>
[~/ansible-opendaylight]$ cat tasks/main.yml
---
- include: install_odl.yml
- include: configure_karaf_features.yml
- include: configure_nb_rest_port.yml
- include: open_nb_rest_port.yml
- include: start_odl.yml
- name: Start ODL systemd service
service:
name=opendaylight
enabled=yes
state=started
- name: Configure ODL Karaf features
template:
src=org.apache.karaf.features.cfg
dest=/opt/opendaylight/etc/
owner=odl
group=odl
notify:
- Stop ODL
- Cleanup Karaf
- Start ODL
[~/ansible-opendaylight]$ wc -l **/*.yml
<snip>
191 total
“don’t unit test your playbook"
“Ansible believes you should not need another framework to validate basic things of your infrastructure”
# Box that installs ODL via its Ansible role on CentOS 7
config.vm.define "cent7_ansible" do |cent7_ansible|
# Build Vagrant box based on CentOS 7
cent7_ansible.vm.box = "boxcutter/centos71"
# Install ODL using the Ansible provisioner
cent7_ansible.vm.provision "ansible" do |ansible|
# Path to Ansible playbook that installs ODL using ODL's Ansible role
ansible.playbook = "provisioning/playbook.yml"
end
end
ansible.playbook = "provisioning/playbook.yml"
[~/vagrant-opendaylight]$ cat provisioning/playbook.yml
---
- hosts: all
sudo: yes
roles:
- opendaylight
[~/vagrant-opendaylight]$ vagrant up cent7_ansible
TASK: [opendaylight | Add ODL yum repo] **********************************
changed: [cent7_ansible]
TASK: [opendaylight | Install ODL via RPM repo] **************************
changed: [cent7_ansible]
TASK: [opendaylight | Configure ODL Karaf features] **********************
changed: [cent7_ansible]
TASK: [opendaylight | Configure ODL NB REST port] ************************
changed: [cent7_ansible]
TASK: [opendaylight | Check if FirewallD service is running] *************
ok: [cent7_ansible]
TASK: [opendaylight | Open ODL NB REST port via FirewallD] ***************
skipping: [cent7_ansible]
TASK: [opendaylight | Start ODL systemd service] *************************
changed: [cent7_ansible]
[~/vagrant-opendaylight]$ vagrant ssh cent7_ansible
[vagrant@localhost ~]$
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[~/vagrant-opendaylight]$ cat provisioning/playbook.yml
---
- hosts: all
sudo: yes
roles:
- role: opendaylight
extra_features: ['odl-ovsdb-openstack']
[~/vagrant-opendaylight]$ vagrant provision cent7_ansible
TASK: [opendaylight | Configure ODL Karaf features] **********************
changed: [cent7_ansible]
NOTIFIED: [opendaylight | Stop ODL] **************************************
changed: [cent7_ansible]
NOTIFIED: [opendaylight | Cleanup Karaf] *********************************
changed: [cent7_ansible]
NOTIFIED: [opendaylight | Start ODL] *************************************
changed: [cent7_ansible]
[~/vagrant-opendaylight]$ vagrant ssh cent7_ansible
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost ~]$ /vagrant/scripts/connect.sh
opendaylight-user@root>config:list | grep odl-ovsdb-openstack
featuresBoot = config,<snip>,odl-ovsdb-openstack
opendaylight-user@root>feature:list | grep odl-ovsdb-openstack
odl-ovsdb-openstack | 1.1.0-Lithium | x | ovsdb-1.1.0-Lithium <snip>
[~]$ sudo ansible-galaxy install dfarrell07.opendaylight
[~/sandbox]$ cat /etc/ansible/hosts
odl_box ansible_ssh_host=10.3.12.87 ansible_ssh_user=centos
[~/sandbox]$ cat install_odl.yml
---
- hosts: odl_box
sudo: yes
roles:
- dfarrell07.opendaylight
[~/sandbox]$ ansible-playbook install_odl.yml
$ docker run -ti dfarrell07/odl:3.0.0 /opt/opendaylight/bin/karaf
$ docker ps
CONTACONTAINER ID IMAGE COMMAND
b2869594fab3 dfarrell07/odl:3.0.0 "/opt/opendaylight/bin/karaf"
[~/sandbox]$ vagrant init -m dfarrell07/opendaylight
[~/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "dfarrell07/opendaylight"
end
[~/sandbox]$ vagrant up
default: URL: https://atlas.hashicorp.com/dfarrell07/opendaylight
==> default: Adding box 'dfarrell07/opendaylight' (v3.0.0)
[~/sandbox]$ vagrant status
Current machine states:
default running (virtualbox)
[~/sandbox]$ vagrant ssh
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
$ packer build -var-file=packer_vars.json centos.json
"iso_urls": [ <CentOS 7.1.1503 mirror URLs> ], "iso_checksum": "<CentOS 7.1.1503 hash>",
"iso_checksum_type": "sha256",
"provisioners": [
{
"type": "shell",
"scripts":
[
"config_virtualbox.sh",
"config_vagrant.sh",
"config_ansible.sh"
],
<snip>
#..."provisioners": [
{
"type": "ansible-local",
"playbook_file": "install_odl.yml"
}
"post-processors": [
{
"type": "vagrant",
"compression_level": "9",
"output": "opendaylight-{{ user `box_version` }}-centos-1503.box"
}
<snip>
Builds finished. The artifacts of successful builds are:
--> 'virtualbox' provider box: opendaylight-3.0.0-centos-1503.box
[~/integration/packaging/packer]$ ls -rc | tail -n 1
opendaylight-3.0.0-centos-1503.box
[~/sandbox]$ vagrant box add --name "opendaylight" \
opendaylight-3.0.0-centos-1503.box
[~/sandbox]$ vagrant init -m opendaylight
[~/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "opendaylight"
end
[~/sandbox]$ vagrant up
==> default: Importing base box 'opendaylight'...
[~/sandbox]$ vagrant ssh
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
"type": "docker",
"image": "centos:7.1.1503",
"type": "shell",
"scripts":
[
"config_docker.sh",
"config_ansible.sh"
],
#..."provisioners": [
{
"type": "ansible-local",
"playbook_file": "install_odl.yml"
}
{
"type": "docker-tag",
"repository": "{{ user `docker_name` }}",
"tag": "{{ user `docker_version` }}",
"force": true,
"only": ["docker"]
}
Builds finished. The artifacts of successful builds are:
--> 'docker' provider: opendaylight/odl:3.0.0 image tagged
$ docker run -ti dfarrell07/odl:3.0.0 /opt/opendaylight/bin/karaf
By Daniel Farrell
Talk given at LinuxCon Europe 2015.