2016-02-03 4 views
0

Ниже приводится сценарий (анзибль версия 2.1.0):Невозможно добавить хост динамически в файле хоста в анзибль

--- 
- hosts: localhost 
    vars_files: 
    - createVmVars.yml 

    pre_tasks: 
    - name: Gathering Vm info. 
     vsphere_guest: 
     vcenter_hostname: "{{vcenter_hostname}}" 
     username: "{{vcenter_username}}" 
     password: "{{vcenter_password}}" 
     guest: "{{guest_name}}" 
     vmware_guest_facts: yes 
     register: var 

    tasks: 
    - name: Setting the VM Ip address in a variable. 
     set_fact: 
     vm_ip: "{{var.ansible_facts.hw_eth0.ipaddresses[0]}}" 

    - name: Adding a new host in inventory file. 
     add_host: name = "{{vm_ip}}" groups=new_group 

- hosts: new_group 
    remote_user: root 

    vars_files: 
    - createVmVars.yml 

    tasks: 
    - name: Copying files from local to target VM. 
     copy: 
     src: "{{item.source}}" 
     dest: "{{item.dest}}" 
     mode: 0644 
     with_items: files_copy 

Сценарий выше нахождения IP-адрес виртуальной машины и пытается подключиться к этому vm, используя ip-адрес (вместо Direct vcenter server) вместо использования модуля vsphere_guest. Я использовал модуль add_host для динамического добавления хоста в файл инвентаря. но я получаю следующее сообщение об ошибке сразу после модуля add_host (не в add_host задачи, но после него) при выполнении его:

Неожиданное исключение: ожидается строка или буфер

полный отслеживающий использованием -vvvv является:

Unexpected Exception: expected string or buffer 
the full traceback was: 

Traceback (most recent call last): 
    File "/home/shasha/devOps/ansible/bin/ansible-playbook", line 85, in <module> 
    sys.exit(cli.run()) 
    File "/home/shasha/devOps/ansible/lib/ansible/cli/playbook.py", line 150, in run 
    results = pbex.run() 
    File "/home/shasha/devOps/ansible/lib/ansible/executor/playbook_executor.py", line 140, in run 
    for batch in self._get_serialized_batches(new_play): 
    File "/home/shasha/devOps/ansible/lib/ansible/executor/playbook_executor.py", line 209, in _get_serialized_batches 
    all_hosts = self._inventory.get_hosts(play.hosts) 
    File "/home/shasha/devOps/ansible/lib/ansible/inventory/__init__.py", line 189, in get_hosts 
    hosts = self._evaluate_patterns(patterns) 
    File "/home/shasha/devOps/ansible/lib/ansible/inventory/__init__.py", line 292, in _evaluate_patterns 
    that = self._match_one_pattern(p) 
    File "/home/shasha/devOps/ansible/lib/ansible/inventory/__init__.py", line 345, in _match_one_pattern 
    hosts = self._enumerate_matches(expr) 
    File "/home/shasha/devOps/ansible/lib/ansible/inventory/__init__.py", line 441, in _enumerate_matches 
    matching_hosts = self._match_list(group.get_hosts(), 'name', pattern) 
    File "/home/shasha/devOps/ansible/lib/ansible/inventory/__init__.py", line 163, in _match_list 
    if pattern.match(getattr(item, item_attr)): 
TypeError: expected string or buffer 
+0

умный подход! Я столкнулся с несколькими проблемами с ошибками типа в Ansible 2, и трассировка, которую она выплевывает, довольно тупо. Добавьте задачу отладки перед задачей add_host и распечатайте значение «{{var.ansible_facts.hw_eth0.ipaddresses [0]}}», а также «vm_ip». Моя догадка заключается в том, что либо этого факта не существует, либо ямль питается кавычками и пытается установить ip как число (которое я использовал в прошлом) –

ответ

0

Получил ответ после того, как сделать несколько глупых попыток: Линия:

add_host: name = "{{vm_ip}}" groups=new_group 

содержит пробелы между именем и знаком =, а также между знаком = и «{{vm_ip}}» и вот почему это не работает должным образом. Хотя это выглядит очень глупо и бессмысленно, но оно работает именно так. Линия должна быть:

add_host: name="{{vm_ip}}" groups=new_group 
0

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

- name: addHosts to a new group 
    local_action: add_host name={{ partnerIP.stdout}} groupname=UpdatedHost 
+0

Это не работает !!! Он работает на вас? – Shasha99

Смежные вопросы