web-dev-qa-db-ja.com

Ansibleの結果から変数を取得する方法

次の形式のエコーを出力するシェルスクリプトがあります
_<variable_1>;<variable_2>;<variable_3>_など

これらの変数を使用し、mysqlクエリを実行してDBを更新したいのです。
mysql -u<user> -p<password> -h<Host> -e'insert into test_table values ("variable_1","variable_2","variable_3")'

私のansibleプレイブックは次のようになります。

_---
- 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] ]
_

エラー:YAMLスクリプトtest_variables.ymlの読み込み中に構文エラーが発生しました

基本的に、シェルコマンドの出力を使用して、それをいくつかの変数に分割し、それらをさらに実行可能なアクションで使用できるようにしたいと考えています。変数に正しくアクセスする方法を教えていただけますか?

ありがとうございました

5
Mukul Jain

このようなエラーが発生した場合は、エラーメッセージの完全な詳細を提供する必要があります。プレイブックを切り取ってファイルに貼り付けて実行しようとすると、次のようになりました。

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] ]
                                          ^

したがって、これが受け取った完全なエラーと一致する場合は、with_items句の構文が間違っているように見えます。

With_itemsを使用してこれを実行しようとしている理由がわかりません。この場合に効果的に行っているのは、不要な変数置換だけです。以下もあなたが望むことを正確に行うはずです:

- 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] }}");'
5
Bruce P

{{}}を正しく引用して使用する必要があります。

- 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]}}" ]

次のようなものを印刷します:

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\");'"
}

item[0], .., item[2]でわかるように、配列"variable_1"ではなく文字列["variable_1","variable_2","variable_3"]にインデックスを付けています。

これを行う最も簡単な(そしてはるかにパフォーマンスの高い)方法は次のとおりです。

- 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(';', '","')}}");'"
3
Kashyap