web-dev-qa-db-ja.com

YAMLのAnsible整数変数

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

この問題を回避する方法についてのアイデアはありますか?ありがとう。

16

私はまったく同じ問題を抱えていて、うまくいかないものをたくさん試したので、しばらくの間、変数なしで実行していましたが、それを持っているすべての人のために答えを見つけました。

ダニエルズのソリューションは確かに機能するはずです:

retries: "{{ Apache_test_retries | int }}"

しかし、少し古いバージョンのansibleを実行している場合は動作しません。だから、updateansibleを確認してください1.8.4そしてそれ動作し、1.8.2では動作しません

これはansibleの元のバグでした: https://github.com/ansible/ansible/issues/5865

20
iblazevic

int filter を使用して整数に変換できるはずです。

retries: "{{ Apache_test_retries | int }}"
10
udondan

同様の問題に直面しました。私の場合、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のバグで問題の解決に役立つことを願っています。

0
Michal Gasek

正しい変数名があることを確認しましたか?

AnsibleはJinja2変数テンプレートを使用します。そのため、変数が存在しない場合は、空の文字列に置き換えられます。

http://jinja.pocoo.org/docs/dev/templates/

変数または属性が存在しない場合、未定義の値が返されます。この種の値でできることは、アプリケーションの構成によって異なります。デフォルトの動作では、印刷されると空の文字列に評価され、繰り返し処理はできますが、他のすべての操作は失敗します。

0
Thomas Betous