【发布时间】:2016-10-23 07:46:27
【问题描述】:
我正在使用 ansible 配置 vagrant box。但是,我的 vagrant 主机不支持 ansible,所以我必须从 vagrant 框中对 localhost 执行 ansible。我正在使用 shell 配置程序,执行一个脚本,该脚本将安装 ansible 并针对同步文件夹中的 playbook 运行正确的 ansible 命令。
此解决方案有效,但感觉混乱且难以维护,因为文件之间的配置数据杂乱无章。正如你在下面看到的,剧本路径有重复,硬编码到 Vagrantfile 和配置脚本。正如我们所知,重复是罪恶之源。相反,我想将所有配置字符串保存在 Vagrantfile 或外部文件中。在我的情况下这可能吗?能够用命令行参数覆盖这些值也很好。
这是 vagrant 文件
VAGRANT_API_VERSION = 2
BOX_IMAGE = "ubuntu/trusty64"
PROVISIONING_SRC = "./provisioning"
PROVISIONING_DEST = "/etc/provisioning/vagrant"
Vagrant.configure(VAGRANT_API_VERSION) do |config|
config.vm.box = BOX_IMAGE
config.vm.network "private_network", ip: "192.168.22.22"
config.vm.network "forwarded_port", guest: 8080, host: 8080
config.vm.network "forwarded_port", guest: 8081, host: 8081
config.vm.network "forwarded_port", guest: 2222, host: 2223
config.vm.network "forwarded_port", guest: 5000, host: 5000
config.vm.network "forwarded_port", guest: 50000, host: 50000
config.vm.provision :shell, path: "provisioning.sh"
config.vm.synced_folder "./provisioning", "/etc/provisioning/vagrant"
end
这是配置脚本
apt-get install -y python-pip
apt-get install -y git-core
if [ -z $PLAYBOOK_PATH ]; then
echo "PLAYBOOK_PATH not set, using default"
PLAYBOOK_PATH=/etc/provisioning/vagrant/playbook.yml
fi
if [ -n $PLAYBOOK_PATH ]; then
echo "PLAYBOOK_PATH set at $PLAYBOOK_PATH"
if [ -f $PLAYBOOK_PATH ]; then
echo "PLAYBOOK FOUND, insalling ansible and starting provisioning"
pip install ansible
pip install markupsafe
if ( ansible-playbook $PLAYBOOK_PATH ); then
echo "provisioning OK"
else
echo "prvosioning failed"
fi
else
echo "PLAYBOOK not found"
fi
else
echo "PLAYBOOK_PATH not set"
fi
最后是配置文件夹中的剧本
- name: Provision local docker host
hosts: localhost
become : yes
roles:
- docker.ubuntu
tasks:
- name: Add vagrant to docker group
become: yes
user: name=vagrant groups=docker append=yes
【问题讨论】:
标签: shell configuration installation vagrant ansible