首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Vagrantfile中使用动态值,例如Shell变量

如何在Vagrantfile中使用动态值,例如Shell变量
EN

Stack Overflow用户
提问于 2019-03-22 23:13:21
回答 1查看 1.4K关注 0票数 0

我有一个简单的Vagrantfile,它具有一些静态值,例如服务器名、主机名和IP地址。这是我的Vagrantfile文件。

代码语言:javascript
复制
# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_NO_PARALLEL'] = 'yes'

Vagrant.configure(2) do |config|

  config.vm.provision "shell", path: "bootstrap.sh"

  # Kubernetes Master Server
  config.vm.define "kmaster" do |kmaster|
    kmaster.vm.box = "centos/7"
    kmaster.vm.hostname = "kmaster.example.com"
    kmaster.vm.network "private_network", ip: "172.42.42.100"
    kmaster.vm.provider "virtualbox" do |v|
      v.name = "kmaster"
      v.memory = 2048
      v.cpus = 2
    end
    kmaster.vm.provision "shell", path: "bootstrap_kmaster.sh"
  end

  NodeCount = 2

  # Kubernetes Worker Nodes
  (1..NodeCount).each do |i|
    config.vm.define "kworker#{i}" do |workernode|
      workernode.vm.box = "centos/7"
      workernode.vm.hostname = "kworker#{i}.example.com"
      workernode.vm.network "private_network", ip: "172.42.42.10#{i}"
      workernode.vm.provider "virtualbox" do |v|
        v.name = "kworker#{i}"
        v.memory = 1024
        v.cpus = 1
      end
      workernode.vm.provision "shell", path: "bootstrap_kworker.sh"
    end
  end

end

下面的shell脚本生成IP地址和主机名等,并将其保存到sample.txt文件中。

代码语言:javascript
复制
#!/usr/bin/env bash
#set -e
File=sample.txt
i=0
for ip in 172.42.42.{100..120}
do
        echo 172.42.42.{1..10} | grep -q "\<$ip\>" && continue
    ((i++))
    rand=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 5 | head -n 1`
    if [[ $i -le 1 ]]; then

         kmaster="${ip} kmaster${rand}.example.com kmaster${rand}"

         if grep -q $kmaster "$File";
        then
            echo " entery already exist in host file.. skipping entry"
            echo -e "\e[01;31mMaster Node is already exist in /etc/hosts file, aborting script execution\e[0m"
            exit $ERRCODE
        else
            echo $kmaster >> sample.txt
            echo $kmaster >> master.txt
        fi
    else
        kworker="${ip} kworker$((i))${rand}.example.com kworker$((i))${rand}"
        if grep -q $kworker "$File";
        then
            echo " Entery already exist in host file ... skipping entry"
            echo -e "\e[01;31mWorker Node is already exist in /etc/hosts file, aborting script execution\e[0m"
            exit $ERRCODE

        else
            echo $kworker >> sample.txt
            echo $kworker >> kworker.txt
        fi
       fi          
done

上面的shell脚本的输出

代码语言:javascript
复制
172.42.42.100 kmasterHees5.example.com kmasterHees5
172.42.42.101 kworker2CCGET.example.com kworker2CCGET
172.42.42.102 kworker3iyDPN.example.com kworker3iyDPN
172.42.42.103 kworker4vTiDG.example.com kworker4vTiDG
172.42.42.104 kworker5eaINq.example.com kworker5eaINq
172.42.42.105 kworker6cLqPv.example.com kworker6cLqPv
172.42.42.106 kworker7o4gEQ.example.com kworker7o4gEQ
172.42.42.107 kworker8XSHBS.example.com kworker8XSHBS
172.42.42.108 kworker9SMNqc.example.com kworker9SMNqc
172.42.42.109 kworker10sV8LR.example.com kworker10sV8LR
172.42.42.110 kworker11eG3kt.example.com kworker11eG3kt
172.42.42.111 kworker128ZvkB.example.com kworker128ZvkB
172.42.42.112 kworker13su92U.example.com kworker13su92U
172.42.42.113 kworker14sL5lh.example.com kworker14sL5lh
172.42.42.114 kworker158de2K.example.com kworker158de2K
172.42.42.115 kworker16chq6W.example.com kworker16chq6W
172.42.42.116 kworker17OIpHA.example.com kworker17OIpHA
172.42.42.117 kworker18Q4UCF.example.com kworker18Q4UCF
172.42.42.118 kworker19PAahY.example.com kworker19PAahY
172.42.42.119 kworker20GMHHd.example.com kworker20GMHHd
172.42.42.120 kworker2160RK6.example.com kworker2160RK6

下一步是循环遍历sample.txt文件并将值保存到变量中。

代码语言:javascript
复制
for i in ` sed s'/=/ /g' sample.txt | awk '{print $1}' `
   do  
   declare ip_addr="$i"
   #echo $ip_addr
   done


for i in ` sed s'/=/ /g' sample.txt | awk '{print $2}' `
   do  
   declare host="$i"
   #echo $link
   done


for i in ` sed s'/=/ /g' sample.txt | awk '{print $3}' `
   do  
   declare name="$i"
   #echo $name
   done

如何将shell变量(例如$ip_add或$host )或将上述脚本中的$name命名为Vagrant?

请提出任何可行的解决方案。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-03-22 23:23:42

如果您在shell端运行export host (或declare -x host),那么您可以参考从该shell启动的ENV["host"]代码。

顺便说一句,编写代码的外壳端将更加合理,类似于以下内容:

代码语言:javascript
复制
export ip_addr host name # mark all three variables for export to the environment
while IFS='= ' read -r ip_addr host name <&3; do  # read a line from FD 3
  vagrant up 3<&-                                 # and run your vagrant command
done 3<sample.txt                                 # with sample.txt open on FD 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55308941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档