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/hosts
在 Vagrantfile
中,所以 Vagrant 完全没有意识到这一点。同样,它不会在 /etc/ansible
.
中查找 host_vars
和 group_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.yml
或 provisioning/group_vars/vagrant/role_name.yml
。 provisioning
可以是目录或(我的偏好)符号链接;后者意味着我可以为我的 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_vars
、group_vars
等库存布局。
我有以下文件夹结构,这似乎使它能够构建和加载角色,但没有加载组和主机变量。怎么会?
/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/hosts
在 Vagrantfile
中,所以 Vagrant 完全没有意识到这一点。同样,它不会在 /etc/ansible
.
host_vars
和 group_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.yml
或 provisioning/group_vars/vagrant/role_name.yml
。 provisioning
可以是目录或(我的偏好)符号链接;后者意味着我可以为我的 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_vars
、group_vars
等库存布局。