While you can use wright without knowing too much about Ruby, understanding that wright scripts are just plain Ruby helps a lot finding your way around wright.

So how is wright Ruby? Let me count the ways…​

Interpreter and DSL

Typically wright scripts use an interpreter line such as the one below to set wright(1) as the script interpreter.

#!/usr/bin/env wright
directory '~/this/is/a/directory', mode: '440'

If you do not want to use the wright interpreter, you can rewrite the script above to use wright as a library.

#!/usr/bin/env ruby
require 'wright'
extend Wright::DSL

directory '~/this/is/a/directory', mode: '440'

The extend Wright::DSL line makes wright DSL methods such as directory available, which are a shorthand for instantiating a resource and performing its default action. If you do not want to use the DSL, you can also use the underlying resources in the following way.

#!/usr/bin/env ruby
require 'wright'

dir = Wright::Resource::Directory.new('~/this/is/a/directory', mode: '440')
dir.create

Block syntax

Resources can also be defined using block notation.

#!/usr/bin/env wright

directory '~/this/is/a/directory' do |d|
  d.mode = '440'
end

Manipulating resources

The DSL methods mentioned above return proper wright resource objects, so you can just save them for later use.

this_is_a_directory = directory '~/this/is/a/directory', mode: '440'
this_is_a_directory.class
# => Wright::Resource::Directory

This is especially handy, since you can name a resource so that you can re-use it later in the update action of another resource.

Update actions

If you want to perform a specific action every time a resource changes, you can use the on_update attribute. Since wright is just Ruby, you can simply set on_update to a proc or a lambda (or anything else that responds to call message, for that matter).

file '/etc/foobard.conf',
     content: "# foobard config\n",
     on_update: -> { `service foobard restart` }

Dry-run mode

Since wright scripts are just Ruby, wright’s dry-run mode only affects wright resources. If you want to make sure not to shoot yourself in the foot, it’s probably a good idea to respect dry-run mode whenever you manipulate your system’s state in your scripts using Ruby.

This script does not respect dry-run mode and will happily delete /tmp/foo, even when run in dry-run mode:

#!/usr/bin/env wright
File.delete('/tmp/foo')

In order to change this script so that it does not touch your system in dry-run mode, you can use the Wright::dry_run? method.

#!/usr/bin/env wright
File.delete('/tmp/foo') unless Wright.dry_run?

Of course, the best way to achieve dry-run awareness in this situation would be to restrict yourself to using only wright’s built-in resources, which all support dry-run mode out of the box.

#!/usr/bin/env wright
file '/tmp/foo', action: :remove

Distributing wright scripts

Looking for a way to package and distribute your wright scripts? Since wright is just Ruby, you can simply use Ruby gems to package, version and distribute your wright scripts. (Don’t forget to add wright as a runtime dependency to your gemspec!)