ansible пропустите запуск игры на компьютере с Ansible playbook - PullRequest
2 голосов
/ 28 марта 2020

Как создать сборник пьес, чтобы отдельная пьеса НЕ выполнялась на машине, с которой запускается Ansible?

Например, если у меня есть простая пьеса для двух игр:

- name: Patch and reboot
  hosts: all
  gather_facts: true

  tasks:
  - name: Fully patch system
    package:
      name: "*"
      state: latest
    become: true
    register: patchstatus

  - name: Reboot if patched
    reboot:
    become: true
    when: patchstatus is changed

Но я не хочу, чтобы перезагрузка запускалась, если она запущена на машине с Ansible.

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

Проще говоря, я ищу предопределенную переменную, поэтому я могу использовать простой when: ansible_hostname != ansible_execution_server, который можно просто использовать для пропуска воспроизведения. (Предполагая, что ansible_execution_server - это имя системы, из которой ansible-playbook выполняется.)

Тогда раздел перезагрузки может быть таким:

  - name: Reboot if patched
    reboot:
    become: true
    when:
      - patchstatus is changed
      - ansible_hostname != ansible_execution_server

Ответы [ 2 ]

1 голос
/ 30 марта 2020

это будет просто пропущено, когда текущее имя хоста равно localhost или если ваш текущий хост является полным доменным именем вашего ansible хоста контроллера (в основном, второе условие применимо, только если вы явно определили ansible fqdn контроллера в ваших хостах файл)

- name: Patch and reboot
  hosts: all
  gather_facts: true

  tasks:
  - name: Fully patch system
    package:
      name: "*"
      state: latest
    become: true
    register: patchstatus

  - name: Reboot if patched
    reboot:
    become: true
    when: 
      - patchstatus is changed
      - inventory_hostname != 'localhost' or inventory_hostname != 'ansible_controller_fqdn'
1 голос
/ 28 марта 2020

Если на вас не нацеливается существующий файл инвентаризации при запуске Playbook, тогда ваша рабочая станция нацелена на Implicit Localhost .

Вы испытываете поведение, потому что глобальная переменная hosts установлена ​​в all. Который, как вы, вероятно, знаете, указывает, что каждая задача должна выполняться на всех хостах в вашем инвентаре.

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

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

Прежде всего, вот документация для Ansible файлов инвентаризации. Я знаю, что документация Ansible очень многословна. Но многие тонкие детали Ansible нюансированы, и если вы обычно просматриваете документы для получения конкретной c информации о реализации, вы можете пропустить много контекста. Я рекомендую вам прочитать весь документ, прежде чем продолжить, если вы этого еще не сделали.

После этого создайте файл инвентаризации следующим образом:

[hardware]
my.router.name
my.switch.name
my.computer.name
my.first.server
my.second.server
my.third.server

[networking]
my.router.name
my.switch.name
my.second.server

[servers]
my.first.server
my.second.server
my.third.server

[computers]
my.computer.name
wife.computer.name

[instances:children]
my.router.name
my.switch.name
my.computer.name
wife.computer.name
my.first.server
my.second.server
my.third.server

В этом примере вы определили всего 7 устройств. Они присутствуют в вашем children разделе. Оттуда вы можете получить различные группы хостов. Например, здесь я создал группы hardware, networking, servers, & computers.

Допустим, вы хотели перезагрузить все свои персональные компьютеры с помощью Playbook. Затем вы должны установить строку 2 на hosts: computers. Если вы хотите перезагрузить все ваши серверы и все ваше сетевое оборудование, то вы можете настроить его следующим образом: hosts: networking:servers

В случае, если вы хотите, чтобы все ваши устройства ЗА ИСКЛЮЧЕНИЕМ ЗА my.computer.name чтобы пропатчить и перезагрузить, вы можете написать свою Playbook следующим образом:

- hosts: hardware:networking:servers:wife.computer.name
  gather_facts: true
  become: true

  tasks:
    - package:
        name: "*"
        state: latest
      register: patchstatus

    - reboot:
      when: patchstatus is changed

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

...