Python's deployment tool fabric makes shell scripts convenient to use in Python, and can easily perform Chef-Solo-like configuration management. In addition, idempotency, which is one of the major features of Chef, can be guaranteed by using cuisine, which is a wrapper for fabric.
It is very simple, the learning cost is low compared to Chef etc., and it can be installed easily because it only needs to be installed on the target machine. This time I wrote a little script to place dotfiles in vagrant using fabric.
It can be installed with one command below.
$ pip install fabric cuisine
Specify the host of the target machine in env.hosts, enclose the command in run (), and execute it. If you want to execute it with sudo, enclose it in sudo (). This is the only basic.
sample.py
# -*- encoding:utf-8 -*-
from fabric.api import env
from fabric.decorators import task
from cuisine import run
env.hosts = ['192.168.33.10']
@task
def A():
run('echo A')
@task
def B():
sudo('echo B')
@task
def main():
A()
B()
If you execute> main, you can see that it can be executed on the target machine as follows.
$ fab main
[192.168.33.10] run: echo A
[192.168.33.10] out: A
[192.168.33.10] run: echo B
[192.168.33.10] out: B
Done.
Disconnecting from 192.168.33.10... done.
Idempotency can be guaranteed by using the _ensure () method such as package_ensure () and the _exisits () method such as dir_exists ().
package_ensure('vim') #Install only if vim is not installed
To link with vagrant, execute the following command.
$ vagrant plugin install vagrant-fabric
Then, describe the following settings in the Vagrantfile.
...
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
...
config.vm.provision :fabric do |fabric|
fabric.fabfile_path = './fabfile.py'
fabric.tasks = ['set_env'] #Task you want to perform
end
end
This time, I wrote a file to place the following dotfile.
fabfile.py
# -*- encoding:utf-8 -*-
from fabric.api import env, settings
from fabric.decorators import task
from cuisine import mode_sudo, select_package, run, package_ensure, dir_exists, cd
select_package('apt')
@task
def set_env():
setup_packages()
fetch_dotfiles()
set_symlinks()
@task
def setup_packages():
with settings(mode_sudo()):
package_ensure('unzip')
@task
def fetch_dotfiles():
if not dir_exists('dotfiles'):
run('git clone --recursive [email protected]:pika-shi/dotfiles.git')
@task
def set_symlinks():
path_pair_list = [
('dotfiles/_zshrc', '.zshrc'), ('dotfiles/_tmux.conf', '.tmux.conf'),
('dotfiles/_vimrc', '.vimrc'), ('dotfiles/_vim', '.vim')
]
with cd('~/'):
for path_set in path_pair_list:
run('ln -s {} {}'.format(*path_set))
If you execute the following command with vagrant up, the task will be executed and the appropriate symbolic link will be attached to the dotfile.
$ vagrant provision
In this way, a little configuration management can be done very easily, so please try it and realize its convenience.
Recommended Posts