Назад | Перейти на главную страницу

ansible как получить хост из инвентаря в задаче

У меня есть два инвентаря, постановочный и производственный.
постановочное содержание:

[webserver]
192.168.56.101  #server 1
192.168.56.103  #server 2

содержание продукции:

[webserver]
192.168.56.108  #server test

Я беру архивный файл с сервера 1 и хочу доставить его на тестовый сервер, а затем распаковать.
мой доступный скрипт похож на:

- name: fetch archived file to local machine
  fetch:
    src: /tmp/code_release_version_{{ release_version }}.tar.gz
    dest: /tmp/code_release_version_{{ release_version }}.tar.gz
    flat: yes
  tags: test

- name: copy archived file to another remote server on /tmp directory
  copy:
    src: /tmp/code_release_version_{{ release_version }}.tar.gz
    dest: /tmp/code_release_version_{{ release_version }}.tar.gz
  delegate_to: 192.168.56.108
  tags: test

- name: extract files
  unarchive:
    src: /tmp/code_release_version_{{ release_version }}.tar.gz
    dest: /var/www
    copy: no
  delegate_to: 192.168.56.108
  tags: test

Я играю:

ansible-playbook -i staging --extra-vars "host=webserver[0] user=emma release_version=1" --ask-sudo-pass playbook.yml --tags "test"

как получить хост из инвентаря вместо того, чтобы писать хост вручную, как я delegate_to: 192.168.56.108 ?

Спасибо раньше.

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

вы используете файл инвентаризации для одной среды при запуске playbook:

ansible-playbook -i staging ... --extra-vars "host=webserver[0]" playbook.yml 

вместо этого вы можете попробовать создать третий файл инвентаризации для такого рода задач, в который включены все ваши серверы.

Я предполагаю, что playbook.yml - это что-то вроде:

hosts: "{{ host }}"
tasks:
- name: fetch archived file to local machine
  fetch:
...

- name: copy archived file to another remote server on /tmp directory
  copy:
..
  delegate_to: 192.168.56.108

так что обходной путь, чтобы избежать использования delegate_to всего включенного файла инвентаризации (давайте назовем его: all):

[webserverdev]
192.168.56.101  #server 1
192.168.56.103  #server 2

[webserverprod]
192.168.56.108  #server test

затем сценарий, подобный следующему:

hosts: webserverdev[0]
tasks:
- name: fetch archived file to local machine
  fetch:
...

hosts: webserverprod[0]
- name: copy archived file to another remote server on /tmp directory
  copy:
..

запуск playbook с использованием нового инвентаря:

ansible-playbook -i all ... playbook.yml