2015-03-31 9 views
5

Mam skrypt, którego wyjście jest echem następującym formacie
<variable_1>;<variable_2>;<variable_3> etcJak zdobyć zmienne z ansibl wyniku

chcę użyć tych zmiennych i uruchomieniu kwerendy mysql do aktualizacji DB jak tak
mysql -u<user> -p<password> -h<host> -e'insert into test_table values ("variable_1","variable_2","variable_3")'

Mój poradnik ansibli wygląda tak.

--- 
- hosts: infoServers 
    sudo: yes 
    gather_facts: no 
    tasks: 
    - name: gather info 
    script: get_hostdata.sh 
    register: result 
    - name: print result 
    local_action: command mysql -uuser -ppassword -h192.168.101.10 ansible_db -e'insert into test_table values ("{{ item[0] }}","{{ item[1] }}","{{ item[3] }});' 
    with_items: [ result.stdout.split(';')[0], result.stdout.split(';')[1], result.stdout.split(';')[2] ] 

ERROR: Syntax Error podczas wczytywania skryptu YAML, test_variables.yml

Zasadniczo chcę, aby być w stanie wykorzystać wyjście polecenia powłoki, podzielić ją na kilka zmiennych i mieć możliwość korzystania z tych w dalsze działania ansibli. Czy możesz wskazać mi, jak poprawnie uzyskać dostęp do zmiennych?

Dziękuję

Odpowiedz

5

Gdy pojawi się błąd, tak naprawdę powinno zapewnić pełne dane komunikatu o błędzie. Kiedy wyciąć i wkleić playbook do pliku i próbował go uruchomić mam następujące:

ERROR: Syntax Error while loading YAML script, ff.yml 
Note: The error may actually appear before this position: line 11, column 43 

    local_action: command mysql -uuser -ppassword -h192.168.101.10 ansible_db -e'insert into test_table values ("{{ item[0] }}","{{ item[1] }}","{{ item[3] }});' 
    with_items: [ result.stdout.split(';')[0], result.stdout.split(';')[1], result.stdout.split(';')[2] ] 
             ^

pojawia się więc, czy to pasuje się z pełną błąd otrzymywali że składnia swojej klauzuli with_items jest źle.

Nie jestem pewien, dlaczego próbujesz to zrobić za pomocą with_items. Wszystko, co skutecznie robisz w tym przypadku, to niepotrzebne zastępowanie zmiennych. Poniższy należy również zrobić dokładnie to, co chcesz:

- name: print result 
    local_action: command mysql -uuser -ppassword -h192.168.101.10 ansible_db -e'insert into test_table values ("{{ result.stdout.split(';')[0] }}","{{ result.stdout.split(';')[1] }}","{{ result.stdout.split(';')[2] }}");' 
+0

Dziękuję za wyjaśnienie. Mam jeszcze jedną wątpliwość - co zrobić, jeśli chcę przypisać wartość result.stdout.split ("; ') [1] do innej zmiennej (np. Var_1), a następnie użyć var_1 później, aby sprawdzić niektóre warunki itp., Co byłoby poprawny sposób na wykonanie tego –

+1

Możesz to zrobić poprzez zadanie [set_fact] (http://docs.ansible.com/set_fact_module.html): set_fact: var1: result.stdout.split (';') [1] var2: result.stdout.split (';') [2] itd. –

+0

Próbowałem tego rozwiązania w najnowszej wersji ansibla i wciąż mówiłem "obiekt listy nie ma elementu 1". Z całą pewnością robi to jako wiersz, zanim wydrukowałem tę samą instrukcję split (bez odwołania do tablicy) za pomocą debugowania i wypisuję wynik jako 3 osobne wpisy ... czego mi brakuje? – dsutherland

3

trzeba cytować i używać {{}} poprawnie.

- hosts: localhost 
    tags: s16 
    gather_facts: no 
    tasks: 
    - shell: echo 'variable_1;variable_2;variable_3' 
    register: result 
    - local_action: debug msg="values ("{{ item[0] }}","{{ item[1] }}","{{ item[3] }}");'" 
    with_items: [ "{{result.stdout.split(';')[0]}}", "{{result.stdout.split(';')[1]}}", "{{result.stdout.split(';')[2]}}" ] 

wypisze coś takiego:

TASK: [debug msg="values ("{{ item[0] }}","{{ item[1] }}","{{ item[3] }}");'"] *** 
ok: [localhost -> 127.0.0.1] => (item=variable_1) => { 
    "item": "variable_1", 
    "msg": "values (\"v\",\"a\",\"i\");'" 
} 
ok: [localhost -> 127.0.0.1] => (item=variable_2) => { 
    "item": "variable_2", 
    "msg": "values (\"v\",\"a\",\"i\");'" 
} 
ok: [localhost -> 127.0.0.1] => (item=variable_3) => { 
    "item": "variable_3", 
    "msg": "values (\"v\",\"a\",\"i\");'" 
} 

Jak widać z item[0], .., item[2] jesteś indeksowanie w ciągu "variable_1" zamiast tablicy ["variable_1","variable_2","variable_3"]

Najprostsza (i dużo więcej wydajnych) sposób to zrobić:

- hosts: localhost 
    tags: s17 
    gather_facts: no 
    tasks: 
    - shell: echo 'variable_1;variable_2;variable_3' 
    register: result 
- debug: msg="insert into tt values ("{{result.stdout|replace(';', '","')}}");'" 
Powiązane problemy