Ansibleを使用してwebappをデプロイしています。特定のページが特定のキー/値を持つJSONを返すことを確認して、アプリケーションが実行されるのを待ちたいです。
失敗する前にタスクを数回試してほしい。したがって、until
/retries
/delay
キーワードの組み合わせを使用しています。
問題は、retries
の数を変数から取得することです。私が書く場合:
retries: {{Apache_test_retries}}
通常のYaml Gotchaに分類されます( http://docs.ansible.com/YAMLSyntax.html#gotchas )。
代わりに、私が書いた場合:
retries: "{{Apache_test_retries}}"
値は整数ではないと言われています。
ValueError:基数10のint()のリテラルが無効です: '{{Apache_test_retries}}'
完全なコードは次のとおりです。
- name: Wait for the application to be running
local_action:
uri
url=http://{{webapp_url}}/health
timeout=60
register: res
Sudo: false
when: updated.changed and Apache_test_url is defined
until: res.status == 200 and res['json'] is defined and res['json']['status'] == 'UP'
retries: "{{Apache_test_retries}}"
delay: 1
この問題を回避する方法についてのアイデアはありますか?ありがとう。
私はまったく同じ問題を抱えていて、うまくいかないものをたくさん試したので、しばらくの間、変数なしで実行していましたが、それを持っているすべての人のために答えを見つけました。
ダニエルズのソリューションは確かに機能するはずです:
retries: "{{ Apache_test_retries | int }}"
しかし、少し古いバージョンのansibleを実行している場合は動作しません。だから、updateansibleを確認してください1.8.4そしてそれ動作し、1.8.2では動作しません
これはansibleの元のバグでした: https://github.com/ansible/ansible/issues/5865
int filter を使用して整数に変換できるはずです。
retries: "{{ Apache_test_retries | int }}"
同様の問題に直面しました。私の場合、celeryd
サービスを再起動したかったのです。再起動に非常に長い時間がかかる場合があります。ソフト再起動に最大30秒を指定してから、強制再起動しました。このためにasync
を使用しました(5秒ごとに再起動結果をポーリングします)。
celery/handlers/main.yml
- name: restart celeryd
service:
name=celeryd
state=restarted
register: celeryd_restart_result
ignore_errors: true
async: "{{ async_val | default(30) }}"
poll: 5
- name: check celeryd restart result and force restart if needed
Shell: service celeryd kill && service celeryd start
when: celeryd_restart_result|failed
そして、上記のプレイブックでタスクのハンドラーとして使用します(restart celeryd
は常にnotify
リストの最初にあります)
あなたの場合、以下のようなものがおそらく動作する可能性があります。確認していないが、別の方法で解決するためのハックのアイデアが得られるかもしれない。また、1番目のタスクでエラーを無視するため、2番目のタスクで問題がないことを確認する必要があります。
- name: Poll to check if the application is running
local_action:
uri
url=http://{{webapp_url}}/health
timeout=60
register: res
Sudo: false
when: updated.changed and Apache_test_url is defined
failed_when: res.status != 200 and res['json'] is not defined and not res['json']['status'] == 'UP'
ignore_errors: true
async: "{{ Apache_test_retries | default(60) }}"
poll: 1
# Task above will exit as early as possible on success
# It will keep trying for 60 secs, polling every 1 sec
# You need to make sure it's fine **again** because it has ignore_errors: true
- name: Final UP check
local_action:
uri
url=http://{{webapp_url}}/health
timeout=60
register: res
Sudo: false
when: updated.changed and Apache_test_url is defined
failed_when: res.status != 200 and res['json'] is not defined and not res['json']['status'] == 'UP'
retries
のバグで問題の解決に役立つことを願っています。
正しい変数名があることを確認しましたか?
AnsibleはJinja2変数テンプレートを使用します。そのため、変数が存在しない場合は、空の文字列に置き換えられます。
http://jinja.pocoo.org/docs/dev/templates/
変数または属性が存在しない場合、未定義の値が返されます。この種の値でできることは、アプリケーションの構成によって異なります。デフォルトの動作では、印刷されると空の文字列に評価され、繰り返し処理はできますが、他のすべての操作は失敗します。