Ansible | Развернуть виртуальную машину, а затем запустить дополнительные сценарии для нового хоста? - PullRequest
1 голос
/ 04 августа 2020

Я новичок в Ansible. Я создал роль Ansible, которая содержит следующие задачи, которые будут развертывать виртуальную машину из шаблона, а затем настраивать виртуальную машину с пользовательскими параметрами ОС:

  • create-vm.yml
  • configure-vm.yml

Я могу успешно развернуть виртуальную машину из шаблона с помощью задачи «create-vm». Но после этого я хотел бы продолжить выполнение задачи «configure-vm». Поскольку файл playbooks / role-vm-deploy.yml содержит «localhost», как показано здесь ...

- hosts: localhost
  roles: 
    - vm-deploy
  gather_facts: no
  connection: local

... следующая задача не выполняется успешно, потому что она пытается запустить задачу против "localhost", а не нового имени хоста виртуальной машины. С тех пор я добавил следующее в конец задачи "create-vm" ...

- name: Add host to group 'just_created'
  add_host:
    name: '{{ hostname }}.{{ domain }}'
    groups: just_created

... но я не совсем уверен, что с этим делать. Я не могу понять, что еще мне нужно сделать и как вызвать новое имя хоста в задаче «configure-vm» вместо localhost.

Я выполняю playbook через CLI

# ansible-playbook playbooks/role-vm-deploy.yml

Я видел этот пост , который был отчасти полезен. Я также видел документацию Dynami c inventory , но на данном этапе это немного переборщило с моей головой. Любая помощь будет оценена. Спасибо!

Вот содержимое для плейбуков и задач

### playbooks -> role-vm-deploy.yml
- hosts: localhost
  roles:
    - vm-deploy
  gather_facts: no
  connection: local

### roles -> vm-deploy -> tasks -> main.yml
- name: Deploy VM
  include: create-vm.yml
  tags:
    - create-vm

- name: Configure VM
  include: configure-vm.yml
  tags:
    - configure-vm
    
### roles -> vm-deploy -> tasks -> create-vm.yml    
- name: Clone the template
  vmware_guest:
    hostname: '{{ vcenter_hostname }}'
    username: '{{ vcenter_username }}'
    password: '{{ vcenter_pwd }}'
    validate_certs: False
    name: '{{ hostname }}'
    template: '{{ template_name }}'
    datacenter: '{{ datacenter }}'
    folder: '/'
    hardware:
      memory_mb: '{{ memory }}'
      num_cpus: '{{ num_cpu }}'
  
    networks:
    - label: "Network adapter 1"
      state: present
      connected: True
      name: '{{ vlan }}'
    state: poweredon
    wait_for_ip_address: yes
    
### roles -> vm-deploy -> tasks -> configure-vm.yml
### This task is what I need to execute on the new hostname, but it attempts to execute on "localhost" ###

# Configure Networking
  - name: Configure IP Address
    lineinfile:
    path: '{{ network_conf_file }}'
    regexp: '^IPADDR='
    line: 'IPADDR={{ ip_address }}'

  - name: Configure Gateway Address
    lineinfile:
    path: '{{ network_conf_file }}'
    regexp: '^GATEWAY='
    line: 'GATEWAY={{ gw_address }}'
    
### roles -> vm-deploy -> defaults -> main.yml
  - All of the variables reside here including "{{ hostname }}.{{ domain }}"

1 Ответ

1 голос
/ 04 августа 2020

Ты так близко! Хитрость заключается в том, чтобы заметить, что playbook на самом деле представляет собой list пьес (объекты yaml, которые имеют {"hosts": "...", "tasks": []}), и цели последующих воспроизведений не обязательно должны существовать, когда playbook запускается - предположительно по этой самой причине . Таким образом:

- hosts: localhost
  roles: 
    - vm-deploy
  gather_facts: no
  connection: local
  # or wherever you were executing this -- it wasn't obvious from your question
  post_tasks:
  - name: Add host to group 'just_created'
    add_host:
      name: '{{ hostname }}.{{ domain }}'
      groups: just_created

- hosts: just_created
  tasks:
  - debug:
      msg: hello from the newly created {{ inventory_hostname }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...