在 Mac OS X 上存储 Ansible 主机文件的位置

76

我想使用Ansible来配置我的Vagrantbox,但我无法解决如何处理主机文件的问题。

根据文档,应该将它们存储在/etc/ansible/hosts中,但我在我的系统(Mac OS X)上找不到这个文件。我还看到一些例子,其中host.ini文件位于文档根目录与vagrant文件相邻的位置。

因此,我的问题是,在设置单个vagrant box时应该将主机文件存储在哪里?

6个回答

83

虽然 Ansible 默认会尝试使用 /etc/ansible/hosts,但有几种方法可以告诉 Ansible 查找替代清单文件的位置:

  • 使用 -i 命令行开关并传递清单文件路径
  • ~/.ansible.cfg[defaults] 部分中添加 inventory = path_to_hostfile 配置文件
  • 像 DomaNitro 在他的回答中建议的那样使用 export ANSIBLE_HOSTS=path_to_hostfile

现在你没有提到是要使用 Vagrant 中可用的 Ansible provisionner,还是要手动提供 Vagrant 主机。

让我们先使用 Vagrant ansible provisionner:

创建一个目录(例如 test),并在其中创建一个 Vagrant 文件:

Vagrantfile

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

  config.vm.box = "precise64-v1.2"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

  config.vm.define :webapp do |webapp|
    webapp.vm.hostname = "webapp.local"
    webapp.vm.network :private_network, ip: "192.168.123.2"
    webapp.vm.provider "virtualbox" do |v|
      v.customize ["modifyvm", :id, "--memory", 200, "--name", "vagrant-docs", "--natdnshostresolver1", "on"]
    end
  end

  # 
  # Provisionning
  #
  config.vm.provision :ansible do |ansible|
    ansible.playbook = "provision.yml"
    ansible.inventory_path = "hosts"
    ansible.sudo = true
    #
    # Use anible.tags if you want to restrict what `vagrant provision`
    # Here is a list of possible tags
    # ansible.tags = "foo bar"
    #
    # Use ansible.verbose to see detailled output for ansible runs
    # ansible.verbose = 'vvv'
    #
    # Customize your stuff here
    ansible.extra_vars = { 
      some_var: 42,
      foo: "bar",
    }
  end
end
现在当你运行vagrant up(或vagrant provision)时,Vagrant的ansible provionner将在与Vagrantfile相同的目录中查找名为hosts的文件,并尝试应用provision.ymlplaybook。
你也可以手动运行它,而不必依赖于Vagrant的ansible provisionner:
ansible-playbook -i hosts provision.yml --ask-pass --sudo

请注意,Vagrant+Virtualbox+Ansible这个组合并不总是相容的。某些版本的组合可能会出现问题。如果您遇到问题(特别是涉及网络方面的问题),请尝试升级到最新版本。

{shameless_plug}您可以在这里找到一个更详细的将vagrant和ansible混合使用的示例{/shameless_plug}

祝好运!


4
针对后来的读者:hostfile已经不推荐使用,请改用inventory - kaiser

47
如果您使用Brew来安装Ansible,那么您很可能会在/usr/local/etc/ansible/hosts找到默认的主机文件。但是,正如其他人所指出的,您可能只想更改默认设置。

7
谢谢。我需要在/usr/local/etc/ansible/创建一个目录,并在其中放置一个主机文件,这与Linux不同。 - vikas027
@counterbeing 如果您是通过MacPorts安装的,则行为相同。不过,您可以创建一个符号链接。 - Buzut
1
如果您通过pip安装了Ansible,它在哪里?请参考http://docs.ansible.com/ansible/intro_installation.html#latest-releases-on-mac-osx。 - Harry Moreno
1
我最终使用“-i”标志来指定主机文件,因为我只是在学习。 - Harry Moreno

7

我喜欢使用bash环境变量作为我的基础项目与其他用户共享。 你可以简单地export ANSIBLE_HOSTS=/pathTo/inventory/这可以是一个主机文件或一个包含多个文件的目录。

你也可以将它写入你的~/.bash_profile中,这样就可以持久化了。 还有一堆其他的变量可以通过这种方式设置,而不是维护一个配置文件。更多信息请查看ansible/lib/ansible/constants.py中的源代码。


6

在Mac上安装Ansible后,这是一份说明文档,指导你接下来该怎么做,我已经亲测可用:ansible-tips-and-tricks.readthedocs.io

我将ansible.cfg文件下载到了以下位置:

/Users/"yourUser"/.ansible

之后,您可以通过取消注释来编辑ansible.cfg文件。

inventory      = /Users/"yourUser"/.ansible 

指定ansible文件夹的路径后,可以通过行命令创建hosts文件,并将其放在该文件夹中。如果要在本地尝试,请将该文件放置在上述文件夹中。

localhost              ansible_connection=local

在hosts文件中添加并尝试使用。
ansible -m ping all

3
如果您使用 Vagrant 的 Ansible provisioner,Vagrant 将自动生成一个 Ansible 主机文件(称为 vagrant_ansible_inventory_default),并配置 ansible-playbook 使用该文件。它看起来像这样:
# Generated by Vagrant

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

它称呼Vagrant主机为“default”,因此您的操作应该引用“default”或“all”。

0
在 Mac 上,我使用 sudo find / -type d -name "ansible" 2> /dev/null 命令来查找它, 但是我在盒子上没有 .../ansible/hosts 文件夹,可能是因为我像上面读到的那样使用了 brew 进行安装,所以我在路径 /etc/ansible/hosts 下创建了它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接