次の形式のエコーを出力するシェルスクリプトがあります
_<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の読み込み中に構文エラーが発生しました
基本的に、シェルコマンドの出力を使用して、それをいくつかの変数に分割し、それらをさらに実行可能なアクションで使用できるようにしたいと考えています。変数に正しくアクセスする方法を教えていただけますか?
ありがとうございました
このようなエラーが発生した場合は、エラーメッセージの完全な詳細を提供する必要があります。プレイブックを切り取ってファイルに貼り付けて実行しようとすると、次のようになりました。
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] }}");'
{{}}
を正しく引用して使用する必要があります。
- 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(';', '","')}}");'"