2016-12-07 1 views
0

Моя цель - выполнять задачи только одного хоста на основе результата. Искал для --limit модуль, но его нет.Ansible - целевой только один хост на основе вывода

Сценарий оболочки выполнен на 3 узлах, который возвращает логическое значение.

ok: [localMulti3] => { 
    "variable": { 
     ... 
     "stdout": "false", 
     ... 
    } 
} 
ok: [localMulti2] => { 
    "variable": { 
     ... 
     "stdout": "false", 
     ... 
    } 
} 
ok: [localMulti1] => { 
    "variable": { 
     ... 
     "stdout": "true", 
     ... 
    } 
} 

Как я могу выполнять задачи только на localMulti3 или localMulti2?

В противном случае с:

- shell: echo 
    when: variable.stdout == "false" and play_hosts[1] 
+0

вам нужно выполнить задачу на каждом хосте, который имеет 'variable.stdout == false' ли? –

+0

Только один хост. И не «случайный». – Kevin

ответ

0

** Обновление ** реальный ответ:

На узле 2 и 3 выполняют:

$: touch /tmp/hi

анзибль:

- stat: 
     path: /tmp/hi 
     register: me 

    - set_fact: 
     run_on: "{{ item }}" 
     with_items: "{{ play_hosts }}" 
     when: run_on is undefined and hostvars[item].me.stat.exists 
     run_once: true 

    - shell: echo 
     when: inventory_hostname == run_on 

** Ниже приведен старый answe r **

Хорошо, все готово. Это не очень хороший метод, но он выполняет свою работу. Это freaking bitc * h, потому что вы не можете просто нацеливать хосты в игре или устанавливать глобальные переменные для хостов в роли.

Единственное, что есть у хозяев, - это окончательное число. Это либо 1, 2, либо 3. И можно установить переменные для других хостов в игре.

Надеюсь, что я смогу спасти другого человека с этим когда-нибудь.

Здесь мы идем:

- hosts: 
     - node1 
     - node2 
     - node3 

    tasks: 
    - name: some command to check on host for TRUE or false 
     shell: somecommand 
     register: commando 

    - name: set fact where stat is false 
     set_fact: 
     theCheck: present 
     when: commando.stat.exists == false 

    - name: echo the hostnames, for convience and shorter naming 
     shell: hostname 
     register: hn 
     changed_when: false 

    # First host check 
    - name: check if 1st node is applicable 
     set_fact: 
     firstNode: True 
     when: "{{ hn.stdout | last | last }} == 1 and theCheck is defined" 

    - name: set a fact for all hosts in play 
     set_fact: 
     checkFirst: "{{ hostvars[groups['all'][0]]['firstNode'] | default(False) }}" 

    - name: perform task if applicable on first host 
     shell: echo 
     when: firstNode is defined 

    # Second host check 
    - name: check if 2nd node is applicable host 
     set_fact: 
     secondNode: present 
     when: "{{ hn.stdout | last | last }} == 2 and theCheck is defined and checkFirst == False" 

    - name: set a fact for all hosts in play 
     set_fact: 
     checkSecond: "{{ hostvars[groups['all'][1]]['secondNode'] | default(False) }}" 

    - name: perform task on second node if applicable 
     shell: echo 
     when: secondNode is defined 

    # Third host check 
    - name: perform task on third node if applicable 
     shell: echo 
     when: "{{ hn.stdout | last | last }} == 3 and mongoSlaves is defined and checkSecond == False" 
     register: thirdNode 

    ### EXTRA 
    - name: perform task on first node if not selected 
     shell: another echo 
     when: "{{ hn.stdout | last | last }} == 1 and firstNode is not defined" 

    - name: perform task on secondary node if not selected 
     shell: another echo 
     when: "{{ hn.stdout | last | last }} == 2 and secondNode is not defined" 

    - name: perform task on third node if not selected 
     shell: another echo 
     when: "{{ hn.stdout | last | last }} == 3 and thirdNode is not defined" 
0

Чтобы выполнить задачу на конкретном хосте, вы можете проверить inventory_hostname переменную:

- shell: echo ok 
    when: variable.stdout | bool == false and inventory_hostname == 'localMulti3' 

Update (с информацией от комментариев) - выполнить задачу только один раз использовать run_once:

- shell: echo ok 
    when: variable.stdout | bool == false 
    run_once: true 
+0

С помощью этого метода мне нужно статически вставить имя хоста. Можно ли сказать правду: выберите первую машину, где утверждение ложно? – Kevin

+0

Обновлено мой ответ –

+0

Это запустит задачу на первом хосте, который является «истинным». – Kevin

0

Если вы используете register результат действия пьесы будет сохранен. Таким образом, в другом действии эта зарегистрированная переменная может быть доступна.

- name: shell_script 
    script: shell_script.sh 
    register: variable 

- shell: echo 
    when: variable.stdout == 'false' 
+0

Да. Но вторая задача выполняется на обоих хостах, которые являются ложными. Я только хочу, чтобы один хозяин был ложным. Я также не хочу включать его статически, например. inventory_hostname == 'localMulti3' – Kevin

+0

В неотвратимой области каждой определенной переменной ограничивается хост, на котором выполняется воспроизведение. Вам нужна какая-то глобальная переменная, которую Ansible не предоставляет, поскольку она создана для одновременного запуска действий на многих серверах. Глобальная переменная приведет к состоянию гонки. – Kadir

+0

Так что моей цели достичь невозможно? А group_vars/all может быть глобальной переменной? – Kevin