diff --git a/.gitignore b/.gitignore
index fd5102c226..b32ee0825d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,6 @@ AUTHORS
ChangeLog
*.sqlite
*~
+
+# Vagrant
+.vagrant
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644
index 0000000000..d1f7bb76b1
--- /dev/null
+++ b/Vagrantfile
@@ -0,0 +1,25 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+VAGRANTFILE_API_VERSION = '2'
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+
+ config.vm.box = 'ubuntu/trusty64'
+
+ config.vm.define 'ironic' do |ironic|
+ ironic.vm.provider :virtualbox do |vb|
+ vb.customize ['modifyvm', :id,'--memory', '2048']
+ end
+
+ ironic.vm.network 'private_network', ip: '192.168.99.11' # It goes to 11.
+
+ ironic.vm.provision 'ansible' do |ansible|
+ ansible.verbose = 'v'
+ ansible.playbook = 'vagrant.yml'
+ ansible.extra_vars = {
+ ip: '192.168.99.11'
+ }
+ end
+ end
+end
diff --git a/doc/source/dev/dev-quickstart.rst b/doc/source/dev/dev-quickstart.rst
index 41e7ceeef8..520d422280 100644
--- a/doc/source/dev/dev-quickstart.rst
+++ b/doc/source/dev/dev-quickstart.rst
@@ -95,6 +95,15 @@ virtual environment, you can do this without starting any other OpenStack
services. For example, this is useful for rapidly prototyping and debugging
interactions over the RPC channel, testing database migrations, and so forth.
+Step 1: System Dependencies
+---------------------------
+
+There are two ways you may use to install the required system dependencies:
+Manually, or by using the included Vagrant file.
+
+Option 1: Manual Install
+########################
+
#. Install a few system prerequisites::
# install rabbit message broker
@@ -122,23 +131,6 @@ interactions over the RPC channel, testing database migrations, and so forth.
# sudo zypper install mariadb
# sudo systemctl start mysql.service
-#. Clone the ``python-ironicclient`` repository and install it within
- a virtualenv::
-
- # from your home or source directory
- cd ~
- git clone https://git.openstack.org/openstack/python-ironicclient
- cd python-ironicclient
- tox -evenv -- echo 'done'
- source .tox/venv/bin/activate
- python setup.py develop
-
-#. Export some ENV vars so the client will connect to the local services
- that you'll start in the next section::
-
- export OS_AUTH_TOKEN=fake-token
- export IRONIC_URL=http://localhost:6385/
-
#. Clone the ``Ironic`` repository and install it within a virtualenv::
# activate the virtualenv
@@ -151,6 +143,8 @@ interactions over the RPC channel, testing database migrations, and so forth.
# install ironic within the virtualenv
python setup.py develop
+#. Create a configuration file within the ironic source directory::
+
# copy sample config and modify it as necessary
cp etc/ironic/ironic.conf.sample etc/ironic/ironic.conf.local
@@ -166,14 +160,51 @@ interactions over the RPC channel, testing database migrations, and so forth.
# turn off the periodic sync_power_state task, to avoid getting NodeLocked exceptions
sed -i "s/#sync_power_state_interval=60/sync_power_state_interval=-1/" etc/ironic/ironic.conf.local
- # initialize the ironic database
- # this defaults to storing data in ./ironic/ironic.sqlite
+#. Initialize the ironic database (optional)
+
+ # ironic defaults to storing data in ./ironic/ironic.sqlite
# If using MySQL, you need to create the initial database
# mysql -u root -e "create schema ironic"
# and switch the DB connection from sqlite to something else, eg. mysql
# sed -i "s/#connection=.*/connection=mysql:\/\/root@localhost\/ironic/" etc/ironic/ironic.conf.local
+At this point, you can continue to Step 2.
+
+Option 2: Vagrant, VirtualBox, and Ansible
+##########################################
+
+This option requires `virtualbox `_,
+`vagrant `_, and
+`ansible `_. You may install these using your
+favorite package manager, or by downloading from the provided links.
+
+Next, run vagrant::
+
+ vagrant up
+
+This will create a VM available to your local system at `192.168.99.11`,
+will install all the necessary service dependencies,
+and configure some default users. It will also generate
+`./etc/ironic/ironic.conf.local` preconfigured for local dev work.
+We recommend you compare and familiarize yourself with the settings in
+`./etc/ironic/ironic.conf.sample` so you can adjust it to meet your own needs.
+
+Step 2: Start the API
+---------------------
+
+Activate the virtual environment created in the previous section to run
+the API::
+
+ # switch to the ironic source (Not necessary if you followed Option 1)
+ cd ironic
+
+ # activate the virtualenv
+ source .tox/venv/bin/activate
+
+ # install ironic within the virtualenv
+ python setup.py develop
+
# This creates the database tables.
ironic-dbsync --config-file etc/ironic/ironic.conf.local create_schema
@@ -185,6 +216,31 @@ interactions over the RPC channel, testing database migrations, and so forth.
#. Open one more window (or screen session), again activate the venv, and then
start the conductor service and watch its output::
+Step 3: Install the Client
+--------------------------
+#. Clone the ``python-ironicclient`` repository and install it within a
+ virtualenv::
+
+ # from your home or source directory
+ cd ~
+ git clone https://git.openstack.org/openstack/python-ironicclient
+ cd python-ironicclient
+ tox -evenv -- echo 'done'
+ source .tox/venv/bin/activate
+ python setup.py develop
+
+#. Export some ENV vars so the client will connect to the local services
+ that you'll start in the next section::
+
+ export OS_AUTH_TOKEN=fake-token
+ export IRONIC_URL=http://localhost:6385/
+
+
+Step 4: Start the Conductor Service
+-----------------------------------
+Open one more window (or screen session), again activate the venv, and then
+start the conductor service and watch its output::
+
# activate the virtualenv
cd ironic
source .tox/venv/bin/activate
@@ -192,10 +248,10 @@ interactions over the RPC channel, testing database migrations, and so forth.
# start the conductor service
ironic-conductor -v -d --config-file etc/ironic/ironic.conf.local
-You should now be able to interact with Ironic via the python client
-(installed in the first window) and observe both services' debug outputs
-in the other two windows. This is a good way to test new features or
-play with the functionality without necessarily starting DevStack.
+You should now be able to interact with Ironic via the python client (installed
+in Step 3) and observe both services' debug outputs in the other two
+windows. This is a good way to test new features or play with the functionality
+without necessarily starting DevStack.
To get started, list the available commands and resources::
diff --git a/vagrant.yml b/vagrant.yml
new file mode 100644
index 0000000000..0e8c45bc4f
--- /dev/null
+++ b/vagrant.yml
@@ -0,0 +1,146 @@
+---
+###############################################################################
+# This ansible playbook installs all supporting software necessary to run the
+# ironic service locally into the vagrant VM attached. Its intent is to provide
+# a quickstart development environment that doesn't pollute an engineer's own
+# machine.
+#
+# The vagrant vm's IP address is assumed to be 192.168.99.11
+#
+# http://docs.openstack.org/developer/ironic/dev/dev-quickstart.html#exercising-the-services-locally
+#
+- hosts: ironic
+ sudo: yes
+ tasks:
+ ############################################################################
+ # APT Updates
+ ############################################################################
+ # Make sure our VM's software is ~@Latest
+ - name: Apt Update
+ apt: update_cache=yes
+ upgrade=dist
+ cache_valid_time=86400
+
+ # Reboot if required.
+ - name: Reboot system if required
+ command: shutdown -r now 'Rebooting to complete system upgrade'
+ removes=/var/run/reboot-required
+ register: rebooted
+ - name: Wait for VM Reboot.
+ sudo: no
+ local_action: wait_for
+ port=22
+ host="{{ip}}"
+ search_regex=OpenSSH
+ delay=10
+ timeout=900
+ when: rebooted.changed
+
+ ############################################################################
+ # Install all the needed packages in one go.
+ ############################################################################
+ - name: Install Required Packages
+ apt: name={{item}}
+ state=present
+ with_items:
+ - rabbitmq-server
+ - python-mysqldb
+ - mysql-server
+ - mysql-client
+
+ ############################################################################
+ # Configure rabbitmq.
+ ############################################################################
+ - name: Ensure rabbitmq is running
+ service: name=rabbitmq-server
+ state=started
+ enabled=yes
+ - name: Add ironic RabbitMQ user
+ rabbitmq_user: user=ironic
+ password=ironic
+ vhost=/
+ configure_priv=.*
+ read_priv=.*
+ write_priv=.*
+ state=present
+
+ ############################################################################
+ # Configure mysql.
+ ############################################################################
+ - name: Configure MySQL
+ lineinfile: dest=/etc/mysql/my.cnf
+ line="bind-address={{ip}}"
+ regexp="^bind\-address"
+ notify: Restart MySQL
+ - name: Create MySQL Database
+ mysql_db: name=ironic state=present
+ - name: Create ironic MySQL user
+ mysql_user: name=ironic
+ password=ironic
+ host={{item}}
+ priv=ironic.*:ALL
+ state=present
+ with_items:
+ - localhost
+ - "%"
+ - name: Ensure mysql is running
+ service: name=mysql
+ state=started
+ enabled=yes
+
+ ############################################################################
+ # Create ironic.conf.local configuration.
+ ############################################################################
+ - name: Update local configuration with vagrant parameters.
+ sudo: no
+ local_action: ini_file dest=etc/ironic/ironic.conf.local
+ section="{{item.section}}"
+ option="{{item.option}}"
+ value="{{item.value}}"
+ with_items:
+ - {
+ section: 'glance',
+ option: 'auth_strategy', value: 'noauth'
+ }
+ - {
+ section: 'neutron',
+ option: 'auth_strategy', value: 'noauth'
+ }
+ - {
+ section: 'database',
+ option: 'connection', value: "mysql://ironic:ironic@{{ip}}/ironic"
+ }
+ - {
+ section: 'DEFAULT',
+ option: 'auth_strategy', value: 'noauth'
+ }
+ - {
+ section: 'DEFAULT',
+ option: 'enabled_drivers', value: 'fake_ipmitool'
+ }
+ - {
+ section: 'DEFAULT',
+ option: 'pecan_debug', value: 'true'
+ }
+ - {
+ section: 'oslo_messaging_rabbit',
+ option: 'rabbit_host', value: "{{ip}}"
+ }
+ - {
+ section: 'oslo_messaging_rabbit',
+ option: 'rabbit_userid', value: "ironic"
+ }
+ - {
+ section: 'oslo_messaging_rabbit',
+ option: 'rabbit_password', value: "ironic"
+ }
+
+
+ #############################################################################
+ # Handlers
+ #############################################################################
+ handlers:
+ - name: Restart MySQL
+ service: name=mysql
+ state=restarted
+ enabled=yes