3

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

/etc/ansible/

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

/文档/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
4

2 回答 2

1

Vagrant 默认使用它自己的,自动生成的库存文件.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory

Vagrant 中有一个选项ansible.inventory_path可以指向库存文件/目录而不是自动生成的目录,但是您不使用它来指向/etc/ansible/hostsin Vagrantfile,因此 Vagrant 完全不知道它。host_vars同样,它不会group_vars/etc/ansible.


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

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

于 2017-04-01T23:47:22.827 回答
0

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

解决方案

在我的 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

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

背景详情

@techraf 要添加的答案中提到的自动生成的库存调整中的ansible.groups设置,Vagrantfile.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory

[vagrant]
default

上面显示的 Vagrantfile 中的行,

  ansible.playbook = "provisioning/site.yml"

不仅指定 playbook,还表示 playbook 目录(或目录的符号链接)是provisioning/.

Vagrant 查看provisioning/host_varsetc 是因为“您还可以将目录添加group_vars/host_vars/您的 playbook 目录中。” (来自此清单文件

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

.vagrant/
ansible.cfg
provisioning -> shared_playbook_directory
Vagrantfile

在共享的剧本目录中,

group_vars/
host_vars/
roles/
site.yml

仅供参考,这个 Ansible 和 Vagrant 介绍页面非常详细地详细介绍了host_varsgroup_vars库存布局。

于 2018-04-16T16:57:29.113 回答