Vagrant 流浪食品供应员是否能够对客人之前所做的更改作出响应;跑什么?

Vagrant 流浪食品供应员是否能够对客人之前所做的更改作出响应;跑什么?,vagrant,ansible,Vagrant,Ansible,我用流浪者和ansible来创造和提供一个环境。我已经让一切正常工作,但我发现有几个命令需要很长时间才能执行。由于ansible不提供查看shell命令的实时输出的方法,因此我决定将这些命令分离出来,以分离shell脚本,并将它们作为shell Provisioniers执行,以便查看它们的输出。当我尝试将shell provisioner放在Vagrantfile的末尾(在Ansible provisioner之后)的过程时,这是有效的,但是如果我中断了这个过程,就会导致问题。下面是一个高级伪

我用流浪者和ansible来创造和提供一个环境。我已经让一切正常工作,但我发现有几个命令需要很长时间才能执行。由于ansible不提供查看shell命令的实时输出的方法,因此我决定将这些命令分离出来,以分离shell脚本,并将它们作为shell Provisioniers执行,以便查看它们的输出。当我尝试将shell provisioner放在Vagrantfile的末尾(在Ansible provisioner之后)的过程时,这是有效的,但是如果我中断了这个过程,就会导致问题。下面是一个高级伪示例:

我有3个剧本:setup.yml、post-download.yml和post-sample-data.yml

所需的流程如下所示:

    Vagrantfile
      provisioner: "ansible", playbook "setup.yml"
        - Tasks...
        - Create shell scripts for upcoming shell provisioners...
        - meta: end_play

      provisioner: "shell", inline: "bin/bash /path/to/created/shell/script"
        (run script)

      provisioner: "ansible", playbook "post-download.yml"
         - Tasks...
         - meta: end_play

      provisioner: "shell", inline: "bin/bash /path/to/created/shell/script"
        (run script)

      provisioner: "ansible", playbook "post-sample-data.yml"
        - Tasks...
        - meta: end_play

      provisioner: "shell", inline: "bin/bash /path/to/created/shell/script"
        (run script)

    end
当我怀着这个想法运行
vagrant provision
时,我在第一次尝试shell provisioner时遇到以下错误:

/tmp/vagrant shell:line 1:bin/sh:没有这样的文件或目录

根据错误消息,我假设vagrant shell无法对vagrant文件执行期间在服务器上所做的更改做出反应;因此,在初始ansible provisioner运行之后,它找不到创建的shell脚本作为provisioner运行。这就是正在发生的事情,还是我有办法让这种方法发挥作用

如果有帮助,下面是我的Vagrant文件中的实际代码:

# Kick off the pre-install Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/setup.yml"
end

# Kick off the installation, and sample data shell scripts so we can get terminal output
if settings['project']['install_method'] == 'install' || settings['project']['install_method'] == 'reinstall'
  config.vm.provision "shell", inline: "bin/sh #{settings['installation']['directory']}/download.sh" 
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/post-download.yml"
  end
  config.vm.provision "shell", inline: "bin/sh #{settings['installation']['directory']}/install.sh"
end

# Kick off the sample data shell script to download the sample data packages so we can get terminal output
if settings['use_sample_data'] == true
  config.vm.provision "shell", inline: "bin/sh #{settings['installation']['directory']}/sample-data.sh" 
end

# Kick off the post-sample-data Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "ansible/post-sample-data.yml"
end

# Kick off the cache warmer script so we can get terminal output
if settings['project']['warm_cache'] == true
    config.vm.provision "shell", inline: "/bin/sh #{settings['installation']['directory']}/cache-warmer.sh"
end
# Kick off the pre-install Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/setup.yml"
end

# Kick off the installation, and sample data shell scripts so we can get terminal output
if settings['project']['install_method'] == 'install' || settings['project']['install_method'] == 'reinstall'
  config.vm.provision "shell", privileged: false, inline: "/bin/sh #{settings['installation']['directory']}/download.sh" 
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/post-download.yml"
  end
  config.vm.provision "shell", privileged: false, inline: "/bin/sh #{settings['installation']['directory']}/install.sh"
end

# Kick off the sample data shell script to download the sample data packages so we can get terminal output
if settings['use_sample_data'] == true
  config.vm.provision "shell", privileged: false, inline: "/bin/sh #{settings['installation']['directory']}/sample-data.sh" 
end

# Kick off the post-sample-data Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "ansible/post-sample-data.yml"
end

# Kick off the cache warmer script so we can get terminal output
if settings['project']['warm_cache'] == true
    config.vm.provision "shell", inline: "/bin/sh #{settings['installation']['directory']}/cache-warmer.sh"
end

多亏了上面@tux的评论,我可以确认,只要ansible项目结构良好,这种方法可以在剧本之间显示输出,等等

对于那些好奇的人,这里是Vagrant文件的更新版本:

# Kick off the pre-install Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/setup.yml"
end

# Kick off the installation, and sample data shell scripts so we can get terminal output
if settings['project']['install_method'] == 'install' || settings['project']['install_method'] == 'reinstall'
  config.vm.provision "shell", inline: "bin/sh #{settings['installation']['directory']}/download.sh" 
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/post-download.yml"
  end
  config.vm.provision "shell", inline: "bin/sh #{settings['installation']['directory']}/install.sh"
end

# Kick off the sample data shell script to download the sample data packages so we can get terminal output
if settings['use_sample_data'] == true
  config.vm.provision "shell", inline: "bin/sh #{settings['installation']['directory']}/sample-data.sh" 
end

# Kick off the post-sample-data Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "ansible/post-sample-data.yml"
end

# Kick off the cache warmer script so we can get terminal output
if settings['project']['warm_cache'] == true
    config.vm.provision "shell", inline: "/bin/sh #{settings['installation']['directory']}/cache-warmer.sh"
end
# Kick off the pre-install Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/setup.yml"
end

# Kick off the installation, and sample data shell scripts so we can get terminal output
if settings['project']['install_method'] == 'install' || settings['project']['install_method'] == 'reinstall'
  config.vm.provision "shell", privileged: false, inline: "/bin/sh #{settings['installation']['directory']}/download.sh" 
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/post-download.yml"
  end
  config.vm.provision "shell", privileged: false, inline: "/bin/sh #{settings['installation']['directory']}/install.sh"
end

# Kick off the sample data shell script to download the sample data packages so we can get terminal output
if settings['use_sample_data'] == true
  config.vm.provision "shell", privileged: false, inline: "/bin/sh #{settings['installation']['directory']}/sample-data.sh" 
end

# Kick off the post-sample-data Ansible provisioner
config.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "ansible/post-sample-data.yml"
end

# Kick off the cache warmer script so we can get terminal output
if settings['project']['warm_cache'] == true
    config.vm.provision "shell", inline: "/bin/sh #{settings['installation']['directory']}/cache-warmer.sh"
end

请注意,在除最后一个脚本provisioner之外的所有脚本中都使用了
privileged:false
。如果您不希望脚本以root用户身份执行,这是必需的。

它应该是
/bin/sh或/bin/bash
,而不是bin/sh或bin/bashWow-我犯了一个多么愚蠢的错误。谢谢你,我要试一试。