【问题标题】:How to use hostvars in vagrant env如何在 vagrant env 中使用主机变量
【发布时间】:2019-02-18 00:47:57
【问题描述】:

我在 vagrant 环境中使用 hostvars 将变量传递给另一个主机时遇到问题,我所做的代码:

Vagrant.configure("2") do |config|

    config.vm.define "server_1" do |server_1|
      server_1.vm.hostname = "n1"
      server_1.vm.box = "centos/7"
      server_1.vm.network "public_network", bridge: "wlp1s0", ip: "192.168.0.50"  
    end

    config.vm.define "worker_1" do |worker_1|
      worker_1.vm.hostname = "n2"
      worker_1.vm.box = "centos/7"
      worker_1.vm.network "public_network", bridge: "wlp1s0", ip: "192.168.0.51"
    end

    config.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
    end

    config.vm.provision "ansible" do |ansible|
      ansible.playbook = "t0a.yml"
    end
 end

t0a.yml

---
- hosts: server*
  tasks:
  - set_fact: hello=world

- hosts: worker*
  tasks:
  - debug:
      msg: "{{ hostvars['server_1']['hello'] }}"

预期:

TASK [show] *******************************************************************
ok: [worker_1] => {
    "msg": [
        "works"
    ]
}

实际:

任务[调试] ******************************************* ************************* 致命的:[worker_1]:失败! => {"msg": "该任务包含一个带有未定义变量的选项。错误是:'ansible.vars.hostvars.HostVarsVars object' has no attribute 'hello'\n\n错误似乎出现在 '/ home/kayke/Documentos/vm-vagrant/provision-ansible/centos/t0_tests/t0a.yml':第 8 行,第 5 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n 任务:\n - 调试:\n ^ 此处\n"}

【问题讨论】:

    标签: ansible


    【解决方案1】:

    你想要的是一个针对服务器和工作者的单一剧本,匹配他们的主机模式,因为这样只有一个 单一的 ansible 运行,而现在发生的是 ansible 正在运行两次,每个主机一次。因此:

    - hosts: server*
      tasks:
      - set_fact: hello=world
    
    - hosts: worker*
      tasks:
      - debug:
          msg: "{{ hostvars["server_1"]["hello"] }}"
    

    并在最后调用,就像您在此处看到的那样:https://github.com/kubernetes-sigs/kubespray/blob/v2.8.3/Vagrantfile#L177-L193

    我对 Vagrant 的研究还不够多,不知道它是否会为你写出清单文件,或者什么,但如果你需要一个示例,kubespray 也会从所有已知的 vm 中生成一个清单文件:https://github.com/kubernetes-sigs/kubespray/blob/v2.8.3/Vagrantfile#L69-L75

    如果您不喜欢这种方法,您也可以使用 fact caching plugins 以使 ansible 以工作人员剧本可以读取的方式为主机写出事实缓存,但您可能会怀疑,这是一个更多的工作。

    【讨论】:

    • 我尝试了这些更改,但继续显示此消息:TASK [debug] *************************** ************************************ 致命:[worker_1]:失败! => {"msg": "该任务包含一个带有未定义变量的选项。错误是:'ansible.vars.hostvars.HostVarsVars object' has no attribute 'hello'\n\n错误似乎出现在 '/ home/kayke/Documentos/vm-vagrant/provision-ansible/centos/t0_tests/t0a.yml':第 8 行,第 5 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n有问题的行似乎是:\n\n 任务:\n - 调试:\n ^ 此处\n"}
    • 请使用这些代码 sn-ps 更新您的帖子,因为 cmets 并非旨在捕获那么多文本。此外,仅包括失败并没有导致失败的步骤以及您从 Vagrantfile 调用它的方式那么有用
    • 看来ansible.limit = "all" 是让一个ansible 运行同时查看所有主机的秘诀。在我这样做之后,hostvars["server_1"]["hello"] 达到了我的预期
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多