Ansible повторно предоставляет тот же хост, даже если файл инвентаризации настроен правильно - PullRequest
0 голосов
/ 03 сентября 2018

Я уже некоторое время пытался отладить это, и я думал, что у меня это работает, но затем сделал некоторые другие изменения, а теперь вернулся снова.

По сути, у меня Vagrant зацикливается на списке определений машин, и хотя мой инвентарь Ansible выглядит отлично, я нахожу, что на самом деле предоставляется только один хост.

Сгенерированный Ansible Inventory - все порты SSH разные, группы правильные

# Generated by Vagrant

kafka.cp.vagrant ansible_host=127.0.0.1 ansible_port=2200 ansible_user='vagrant' ansible_ssh_private_key_file='/workspace/confluent/cp-ansible/vagrant/.vagrant/machines/kafka.cp.vagrant/virtualbox/private_key' kafka='{"broker": {"id": 1}}'
zk.cp.vagrant ansible_host=127.0.0.1 ansible_port=2222 ansible_user='vagrant' ansible_ssh_private_key_file='/workspace/confluent/cp-ansible/vagrant/.vagrant/machines/zk.cp.vagrant/virtualbox/private_key'
connect.cp.vagrant ansible_host=127.0.0.1 ansible_port=2201 ansible_user='vagrant' ansible_ssh_private_key_file='/workspace/confluent/cp-ansible/vagrant/.vagrant/machines/connect.cp.vagrant/virtualbox/private_key'

[preflight]
zk.cp.vagrant
kafka.cp.vagrant
connect.cp.vagrant

[zookeeper]
zk.cp.vagrant

[broker]
kafka.cp.vagrant

[schema-registry]
kafka.cp.vagrant

[connect-distributed]
connect.cp.vagrant

Сгенерированный файл hosts - правильные IP-адреса и имена хостов

## vagrant-hostmanager-start id: aca1499c-a63f-4747-b39e-0e71ae289576
192.168.100.101 zk.cp.vagrant

192.168.100.102 kafka.cp.vagrant

192.168.100.103 connect.cp.vagrant

## vagrant-hostmanager-end

Ansible Playbook, который я хочу запустить - Правильно соответствуют группам в моем инвентаре

- hosts: preflight
  tasks:
  - import_role:
      name: confluent.preflight
- hosts: zookeeper
  tasks:
  - import_role:
      name: confluent.zookeeper
- hosts: broker
  tasks:
  - import_role:
      name: confluent.kafka-broker
- hosts: schema-registry
  tasks:
  - import_role:
      name: confluent.schema-registry
- hosts: connect-distributed
  tasks:
  - import_role:
      name: confluent.connect-distributed

Любой код, отсутствующий здесь, см. Confluent :: cp-ansible .

Ниже приведен пример моего Vagrantfile. (Я сделал форк , но не совершил, пока я не заработаю ...)

Я знаю, что это if index == machines.length - 1 должно работать в соответствии с документацией Vagrant , и он запускает все машины, затем запускает Ansible только на последней машине, но только все задачи выполняются на первый один по какой-то причине.

machines = {"zk"=>{"ports"=>{2181=>nil}, "groups"=>["preflight", "zookeeper"]}, "kafka"=>{"memory"=>3072, "cpus"=>2, "ports"=>{9092=>nil, 8081=>nil}, "groups"=>["preflight", "broker", "schema-registry"], "vars"=>{"kafka"=>"{\"broker\": {\"id\": 1}}"}}, "connect"=>{"ports"=>{8083=>nil}, "groups"=>["preflight", "connect-distributed"]}}

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

  if Vagrant.has_plugin?("vagrant-hostmanager")
    config.hostmanager.enabled = true
    config.hostmanager.manage_host = true
    config.hostmanager.ignore_private_ip = false
    config.hostmanager.include_offline = true
  end

  # More info on http://fgrehm.viewdocs.io/vagrant-cachier/usage
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end

  if Vagrant.has_plugin?("vagrant-vbguest")
    config.vbguest.auto_update = false
  end

  config.vm.box = VAGRANT_BOX
  config.vm.box_check_update = false
  config.vm.synced_folder '.', '/vagrant', disabled: true

  machines.each_with_index do |(machine, machine_conf), index|
    hostname = getFqdn(machine.to_s)

    config.vm.define hostname do |v|
      v.vm.network "private_network", ip: "192.168.100.#{101+index}"
      v.vm.hostname = hostname

      machine_conf['ports'].each do |guest_port, host_port|
        if host_port.nil?
          host_port = guest_port
        end
        v.vm.network "forwarded_port", guest: guest_port, host: host_port
      end

      v.vm.provider "virtualbox" do |vb|
        vb.memory = machine_conf['memory'] || 1536 # Give overhead for 1G default java heaps
        vb.cpus = machine_conf['cpus'] || 1
      end

      if index == machines.length - 1
        v.vm.provision "ansible" do |ansible|
          ansible.compatibility_mode = '2.0'
          ansible.limit = 'all'
          ansible.playbook = "../plaintext/all.yml"
          ansible.become = true
          ansible.verbose = "vv"

          # ... defined host and group variables here

        end # Ansible provisioner
      end # If last machine
    end # machine configuration
  end # for each machine
end 

Я настраиваю задачу Ansible следующим образом

- debug:
    msg: "FQDN: {{ansible_fqdn}}; Hostname: {{inventory_hostname}}; IPv4: {{ansible_default_ipv4.address}}"

Только с этой задачей обратите внимание, что следующее ansible_fqdn - это всегда zk.cp.vagrant, и это согласуется с тем фактом, что Ansible предоставляет только виртуальную машину.

ok: [zk.cp.vagrant] => {
    "msg": "FQDN: zk.cp.vagrant; Hostname: zk.cp.vagrant; IPv4: 10.0.2.15"
}
ok: [kafka.cp.vagrant] => {
    "msg": "FQDN: zk.cp.vagrant; Hostname: kafka.cp.vagrant; IPv4: 10.0.2.15"
}
ok: [connect.cp.vagrant] => {
    "msg": "FQDN: zk.cp.vagrant; Hostname: connect.cp.vagrant; IPv4: 10.0.2.15"
}

Обновление с минимальным примером: hostname -f - это только один хост, и я предполагаю, что gather_facts работает для ansible_fqdn

ansible all --private-key=~/.vagrant.d/insecure_private_key --inventory-file=/workspace/confluent/cp-ansible/vagrant/.vagrant/provisioners/ansible/inventory -a 'hostname -f' -f1

zk.cp.vagrant | SUCCESS | rc=0 >>
kafka.cp.vagrant

connect.cp.vagrant | SUCCESS | rc=0 >>
kafka.cp.vagrant

kafka.cp.vagrant | SUCCESS | rc=0 >>
kafka.cp.vagrant

1 Ответ

0 голосов
/ 08 сентября 2018

Оказывается, я могу обойти проблему с не с этим разделом в моем ansible.cfg

[ssh_connection]
control_path = %(directory)s/%%h-%%r
...