2016-08-24 3 views
1

私はansibleどのようにして、psqlプロセスを偶発的なものにすることができますか?

- name: Run psql to pull in initial config data 
    become_method: sudo 
    become: yes 
    become_user: postgres 
    shell: psql -U postgres -w eclaim < /opt/eclaim_revamp/sql_scripts/{{ item }}.sql 
    with_items: 
    - initial_config 
    - initial_sql_script 
    - tmp_hrms 

psqlプロセスを実行するプロセスを持ってこのタスクはすべての時間を実行します。私はどのようにしてこの等式を作るのですか?

+1

誰に教えてもらえますか?スクリプトの内容のみに依存します。プレチェックを作成する必要があります(3つのスクリプトのそれぞれに別々のスクリプトが用意されている可能性が高い)。プレチェックで返された条件が満たされない場合にのみ、実際のスクリプトを実行する必要があります。 – techraf

答えて

2

唯一の方法は、sqlスクリプトをシェルスクリプトにラップしてチェックすることです。私の提案は、そのスクリプトを書くことであろう

- name: Run psql 
    shell: createuser.sh 
    register: result 
    changed_when: "'User created' in result.stdout" 
+0

1)非冪等2)コマンドラインは非現実的な方法ではありません3) –

1

#!/bin/bash 
if [[ $(psql postgres -tAc "SELECT 'found' FROM pg_roles WHERE rolname='{{ user }}'" | grep found) ]]; then 
    echo "User exists" 
else 
    psql -c "CREATE USER {{ user }} LOGIN ENCRYPTED PASSWORD '{{ password }}';" > /dev/null 
    echo "User created" 
fi 

そして、あなたの脚本で:ちょうど例(私はpostgresql_userモジュールがあると知っているが、これは一例です)として
データベースに問い合わせてステータスを確認します。このスクリプトは何も変更できないはずであり、changed_when: falseを使用して独自のタスクとして設定し、いくつかのインテリジェント出力を出力する必要があります。 register: result

すべての変更を行う既存のタスクは条件付きwhen: result.stdout contains <some string>である必要があります。そのため、最初のタスクでデータベースが正しい状態でないと判断された場合にのみ実行されます。

もっと良い解決策は、このセットアップに提供されたPostgresモジュールを使用することですが、.sqlスクリプトの内容がわからないと、それが可能かどうかわかりません。

関連する問題