host_vars 和 group_vars 未加载

host_vars and group_vars are not getting loaded

我有以下文件夹结构,这似乎使它能够构建和加载角色,但没有加载组和主机变量。怎么会?

/etc/ansible/

- hosts
- requirements.yml
- group_vars/
    - app/
        - postgres.yml
- host_vars/
    - app1/
        - postgres.yml
- roles

/documents/ansible/

- playbook.yml
- vagrant

主机文件

# Application servers
[app]
192.168.60.6

# Group multi 
[multi:children]
app


#variables applied to all servers
[multi:vars]
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

**流浪汉**

# -*- mode: ruby -*-
# vi: set ft=ruby :


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

  # Genral Vagrant VM Configuration.
  config.vm.box = "geerlingguy/centos7"
  config.ssh.insert_key = false
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.provider :virtualbox do |v|
    v.memory = 256
    v.linked_clone = true
  end

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

# Application server 1
config.vm.define "app1" do |app|
  app.vm.hostname = "orc-app1.dev"
  app.vm.network :private_network, ip: "192.168.60.6"
end

end

默认情况下,Vagrant 在 .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory.

中使用自己的自动生成的清单文件

在 Vagrant 中有一个选项 ansible.inventory_path 可以指向库存 file/directory 而不是自动生成的,但是你不用它来指向 /etc/ansible/hostsVagrantfile 中,所以 Vagrant 完全没有意识到这一点。同样,它不会在 /etc/ansible.

中查找 host_varsgroup_vars

另一方面,角色的路径不会被清单文件覆盖,因此 Vagrant 使用自己的路径这一事实不会影响角色的路径。

它们默认从 /etc/ansible/roles(或 Ansible 默认使用的任何目录,例如 macOS 上的 /usr/local/etc/ansible/roles)加载。

这是对我有用的;它是在本网站和其他网站上找到的各种建议的组合,

解决方案

在我的 Vagrantfile 中(特别是注意 ansible.groups 行),

 config.vm.provision "ansible" do |ansible|
  ansible.playbook = "provisioning/site.yml"
  # "default" is the name of the VM as in auto-generated
  ansible.groups = { "vagrant" => ["default"] }
end

我的 VM 清单数据进入 provisioning/host_vars/default and/or provisioning/group_vars/vagrant - 作为文件或带有文件的目录(我更喜欢这样,这样我可以为我的每个角色都有一个文件正在使用)。确保这些清单文件具有有意义的扩展名(因此 .yml 假设 YAML 格式文件)因此 provisioning/host_vars/default/role_name.ymlprovisioning/group_vars/vagrant/role_name.ymlprovisioning 可以是目录或(我的偏好)符号链接;后者意味着我可以为我的 vagrant-handled 虚拟机设置一组通用角色。 陷阱:使用文件扩展名很重要;我注意到我以前在没有扩展名的文件中拥有的清单数据现在被忽略了,所以我认为这是 Ansible 读取其清单方式的变化。

背景详情

Vagrantfile 中的 ansible.groups 设置调整了 .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory 中自动生成的清单,在 @techraf 的回答中提到,

[vagrant]
default

上面显示的 Vagrantfile 中的行,

  ansible.playbook = "provisioning/site.yml"

不仅指定剧本,还意味着剧本目录(或目录的符号链接)是provisioning/

Vagrant 在 provisioning/host_vars 等中查找,因为“您还可以将 group_vars/host_vars/ 目录添加到您的剧本目录中。” (来自这个inventory documentation

为清楚起见,这里是每个 vagrant VM 目录的内容,

.vagrant/
ansible.cfg
provisioning -> shared_playbook_directory
Vagrantfile

并在共享剧本目录中,

group_vars/
host_vars/
roles/
site.yml

仅供参考 this Ansible & Vagrant intro page 详细介绍了 host_varsgroup_vars 等库存布局。