【问题标题】:running plays on host besides running on vagrant guests when playbook is provisioned via vagrant当通过 vagrant 提供 playbook 时,除了在 vagrant guest 上运行之外,还在主机上运行 play
【发布时间】:2016-11-19 01:41:22
【问题描述】:

我实际上是 ansible 的新手。我相信我正在使用一个 ansible 即 Ubuntu 主机的 /usr/bin/ansible 来配置 vagrant 客人,但是,我可以在哪里更改我的剧本,以便我可以控制主机上的一些东西,除了 vagrant 客人?

【问题讨论】:

    标签: vagrant ansible-playbook


    【解决方案1】:

    要在本地主机上运行命令,基本上有两种选择:

    1. 您可以使用local_action 来快速获取内容,如下所示:

    - name: take out of load balancer pool local_action: command /usr/bin/some_command

    1. 您可以像这样在剧本中包含一系列任务:

    - name: Execute some local commands hosts: localhost tasks: - local_action: command /usr/bin/some_command - local_action: command /usr/bin/some_command

    有关更多信息,请参阅非常广泛的docmentation

    【讨论】:

      【解决方案2】:

      在您的 Vagrantfile 中,您可以将配置定义为:

      config.vm.provision "ansible" do |ansible|
      ansible.playbook = "myPlaybook.yml"
      

      在这种情况下,Vagrant 会自动在 .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory 中创建一个 Ansible 库存文件 看起来像:

      # Generated by Vagrant
      default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
      

      所以 playbook 运行到 localhost,通过 ssh 连接到端口 2222,而不是 localhost

      ---
      - hosts: localhost
        connection: local
      

      如果我很好理解您的问题,您需要在 Vagrant 提供的主机和您的 Vagrant 主机 (localhost) 上运行相同的 playbook。

      所以我认为您可以为 Vagrant 提供的主机分配一个 ip,这些主机使用 Ansible 进行配置,并使用您将提供给 Vagrant 的静态清单文件,因此您的 Vagrantfile 将包含类似

      config.vm.network "private_network", ip: "192.168.33.10"
      ...
      
      config.vm.provision "ansible" do |ansible|
      ansible.playbook = "myPlaybook.yml"
      ansible.inventory_path = "./myInventory"
      

      在 ./myInventory 中

      myHost1 ansible_ssh_host=192.168.33.10 ansible_ssh_port=22
      

      那么您应该能够将 vagrant 提供的主机(因为它是远程主机)与您的本地主机区分开来。然后,您将安排具有不同目标(myHost1 和 localhost)的剧本,它应该正确处理 local_action。

      在您的清单中,您可以像在任何 ansible 清单文件中一样定义组,并且您可以告诉 Vagrantfile 负责提供 ansible.groups

      config.vm.provision "ansible" do |ansible|
      ansible.playbook = "myPlaybook.yml"
      ansible.inventory_path = "./myInventory"
      ansible.groups = { 
      "group1" => ["myGroup"]
      

      【讨论】:

      • 如果我这样做,那么我不能用单个vagrant up 做这些事情。由于我们使用的是 host 的 ansible,因此必须有可能在同一 playbook 上玩 host 。
      • 你能提供一个关于你的需求的例子吗?
      • 你可以在我的另一个 [stackoverflow.com/questions/40623847/…(问题)上找到它。谢谢
      • 为什么不使用 Vagrant 同步文件夹?您可以触摸 /vagrant(在来宾计算机上)中从本地 vagrant 框共享的文件。所以你可以在你的剧本中“忘记” localhost。
      • 是的。那是完美的。但是,这仍然可以扩展到重新包装 Vagrant 盒子等任务。如何实现?我的意思是在盒子上安装某些程序后,如果需要再次打包。如何通过相同的剧本实现它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多