2016-05-04 4 views
2

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

У меня есть задача, которая собирается запустить команду "Утилита lspci | Grep Ethernet | Grep Gigabit"

Вывод должен выглядеть примерно так (должно быть 2 строки вывода):

"02:00.0 Ethernet controller: Intel Corporation 82575EB Gigabit Network Connection (rev 02)" 
"02:00.1 Ethernet controller: Intel Corporation 82575EB Gigabit Network Connection (rev 02) 

Из этого вывода мне нужно извлечь 4 части информации в качестве переменных.

var1 - Мне нужен автобус первой линии. Должно быть «02»

var2 - Мне нужна функция первой линии. Должно быть «0»

var3 - Мне нужен автобус второй линии. Должно быть «02»

var4 - Мне нужна функция второй линии. Должно быть «1»

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

Спасибо за помощь.

+0

вы пробовали с помощью 'register'? Покажите, что вы пробовали, и мы можем помочь. – tedder42

+0

Если я использую регистр, он будет принимать всю строку вывода, когда я хочу только очень маленькое подмножество строки – JaReg

+1

, оно дает «линии», поэтому вы можете начать собирать куски с помощью Jinja. – tedder42

ответ

1

Как и было предложено, вы должны указать register вывод команды. После этого, вы можете петлю над результатами и захватить части вы заинтересованы в

Рабочего пример:.

- name: Fun with lspci output 
    hosts: localhost 
    connection: local 
    tasks: 
    - name: get Gigabit Ethernet adapters 
    shell: lspci | grep Ethernet | grep Gigabit | awk '{print $1}' 
    register: eth_adapters 

    - name: use extracted info 
    debug: msg="Adapter found, bus {{item.split(':')[0]}}, function {{item.split('.')[-1]}}" 
    with_items: "{{eth_adapters.stdout_lines}}" 

Обратите внимание на использовании eth_adapters.stdout_lines, чтобы получить вывод команды как список элементов, и awk '{print $1}', чтобы получить информацию о шинах устройства.

В этом примере получается следующий результат:

PLAY [Fun with lspci output] *************************************************** 

TASK [setup] ******************************************************************* 
ok: [localhost] 

TASK [get Gigabit Ethernet adapters] ******************************************* 
changed: [localhost] 

TASK [use extracted info] ****************************************************** 
ok: [localhost] => (item=00:00.0) => { 
    "item": "00:00.0", 
    "msg": "Adapter found, bus 00, function 0" 
} 
ok: [localhost] => (item=00:01.0) => { 
    "item": "00:01.0", 
    "msg": "Adapter found, bus 00, function 0" 
} 
ok: [localhost] => (item=00:01.1) => { 
    "item": "00:01.1", 
    "msg": "Adapter found, bus 00, function 1" 
} 
ok: [localhost] => (item=00:01.3) => { 
    "item": "00:01.3", 
    "msg": "Adapter found, bus 00, function 3" 
} 


PLAY RECAP ********************************************************************* 
localhost     : ok=3 changed=1 unreachable=0 failed=0 
Смежные вопросы