Ansible: рдлрд╝реАрдЪрд░: рдмреНрд▓реЙрдХреЛрдВ рдкрд░ рд▓реВрдк рддрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдпрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рд╕рд┐рддре░ 2018  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ansible/ansible

рд╕рд╛рд░рд╛рдВрд╢

рдпрд╣ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдПрдХрд▓ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓реВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдорддрджрд╛рди рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдЖрдк рдЗрд╕ рдкреНрд░рдЧрддрд┐ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдмреИрдХрдПрдВрдб рдкрд░ рдзрдХреНрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

- hosts: localhost
  tasks:
  - name: Start a long-running task
    uri:
      url: https://some-service/v1/put/new_job
      body: { foo: bar }
    register: new_job

  - until: job_status.json.message in ['Finished', 'Failed']
    block:
    - name: Get job status
      uri:
        url: https://some-service/v1/get/new_job
      register: job_status

    - name: Report job status to web service
      uri:
        url: https://backend-system/v1/post/job_status
        body: '{{ job_status.json }}'

рдЗрд╕рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧ рд╣реИрдВред

рд╡рд┐рд╖рдп рд╡рд░реНрдЧ
  • рдлрд╝реАрдЪрд░ рдЖрдЗрдбрд┐рдпрд╛
рдШрдЯрдХ рдХрд╛ рдирд╛рдо

рд╕рд╛рд░

affects_2.8 feature has_pr core

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдПрдХ рдмреНрд▓реЙрдХ рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдмрд╣реБрдд рдЙрд▓реНрдЯрд╛ рд╣реИред рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдерди рд╡рд╛рд▓реА рд▓реВрдк рд╡рд╛рд▓реА рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЗрддрдиреА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред

рд╕рднреА 29 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@mkrizek рд╣рдореНрдо, рдореИрдВрдиреЗ рдХреАрд╡рд░реНрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рдЦреЛрдЬ рдХреА, рдФрд░ рд╡рд╣ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд░рд╣рд╛ :-(

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВрдиреЗ until: рдХреЗ рд╕рд╛рде block: , include: рдФрд░ include_tasks рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓рд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдФрд░ 2 рдЕрдиреНрдп рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╢рд╛рдорд┐рд▓ рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддреЗ рд╣реИрдВ .

- hosts: localhost
  tasks:
  - include: taskboot.yml
    until: 5|random == 5

рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реВрдкрд┐рдВрдЧ рдХреЗрд╡рд▓ loop: рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

- hosts: localhost
  tasks:
  - include: taskboot.yml
    loop: [ 1, 2, 3, 4, 5 ]

рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, until: рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ $ include: рдФрд░ include_tasks: рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

- hosts: localhost
  tasks:
  - include: taskbook.yml
    until: false
    retries: 5
    delay: 1

рд╣рд╛рдБ, until рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, https://github.com/ansible/ansible/pull/46177 рджреЗрдЦреЗрдВред

@mkrizek рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рди рддреЛ рдмреНрд▓реЙрдХ рдкрд░ рдпрд╛ рди рд╣реА рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╢реАрд░реНрд╖рдХ рдмрджрд▓ рджрд┐рдпрд╛ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдЯрд╛рд╕реНрдХрд┐рдлрд╛рдИ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдЙрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рддрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

https://github.com/ansible/proposals/issues/136

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@sivel рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рди рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛? рдЬреИрд╕рд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рддреЛ рдпрд╣ рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдмрд╛рдд рд╣реЛрдЧреАред (рдпрд╛рдиреА рдПрдХ рдирд╛рдЯрдХ рдХреЗ рднреАрддрд░ рд╣рд░ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓реВрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛)

рдмреНрд▓реЙрдХ рд╡рд░реНрддрдорд╛рди рдореЗрдВ 'рд╕реНрдереИрддрд┐рдХ' рд╕рдореВрд╣ рд╣реИрдВ, рдЙрди рдкрд░ рд▓реВрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ (рди рдХрд┐ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ) рдЙрдиреНрд╣реЗрдВ рдЧрддрд┐рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ... рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ include: рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛, рдЗрд╕рдХреЗ рдХрдИ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рдЬреЛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

@bcoca рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ block рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ block_dynamic рдФрд░ block_static рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рд╛рде рд╣реА, ansible рдХрд╛ _рдкреНрд░рддреНрдпреЗрдХ_ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ, рдпрд╛ рд╣рдорд╛рд░рд╛ рдЖрдВрддрд░рд┐рдХ рдирд┐рд╣рд┐рдд рдЙрдкрдпреЛрдЧред рд╡реЗ рдПрдХ рдореМрд▓рд┐рдХ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЕрднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛрдИ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рднреА рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред "рд▓реВрдк" рдФрд░ рдЬрдм рддрдХ-рд▓реВрдк рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╕рдордЧреНрд░ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдореНрдореАрдж рдпрд╣ рд╣реИ рдХрд┐ "рд▓реВрдк" рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рднреА рд▓реВрдк рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рджреЛрдиреЛрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реВрдк рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП/рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ ...

рдХрд╛рдо рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рд╕реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣реИ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд╢рд╛рдорд┐рд▓ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд▓рдкреЗрдЯрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛрддрд╛ рд╣реИред

рдЬреИрд╕реЗ, рдЯрд╛рд╕реНрдХ_рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд░ рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд░рдгрдиреАрддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЯреАрдХреНрдпреВрдПрдо рдореЗрдВ рдЯрд╛рд╕реНрдХ рдмреНрд▓реЙрдХ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЯрд╛рд╕реНрдХ_рдПрдХреНрд╕рдХреНрдпреВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рд░реЛрд▓ рдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рдЬреНрдп рдХреА рдХреЛрдИ рдЯреНрд░реИрдХрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рддреЛ рдПрдХ рд▓реВрдк рддрдХ, рдЬреЛ рдЕрд╕рдлрд▓/рд╕рдлрд▓рддрд╛ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдЧрд╛, рдХреЗрд╡рд▓ рдпрд╣ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд░рдгрдиреАрддрд┐ рдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрд╕рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред рдХрд┐рд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рд╕рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрдкрд░реЗрд╢рди рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рд╢рд░реНрддреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рдо рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдордиреЗ рдЕрднреА "рдЗрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛" рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рд▓реЛрдЧ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрддреНрддрд░/рдкреНрд░рд╕реНрддрд╛рд╡#136 рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЬрдм рддрдХ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд╕реЗрдЯ рдпрд╛ рдкрдВрдЬреАрдХреГрдд рд╡рд░реНрд░реНрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛ ...

@dagwieers рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рдЕрдм рдмрдВрдж рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд╛рд▓рд┐рдпрд╛ рд╕реБрдЭрд╛рд╡ (рдЙрдкрд░реЛрдХреНрдд @sivel рдЯрд┐рдкреНрдкрдгреА) рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рд╣реИ:

https://github.com/ansible/ansible/issues/46203#issuecomment -425111123

рдФрд░ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡реЗ рдЕрдкрдиреА рдкреАрда рд╕реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд▓реВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдХрд░ рд╕рдХреЗрдВред рддрдм рдХрдо рд╕реЗ рдХрдо рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗ, рддрд╛рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдФрд░ рдирдпрд╛ block_dynamic: рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реНрдерд┐рд░ block: рдмрд░рдХрд░рд╛рд░ рди рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗ? рдХреНрдпрд╛ рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрд░реНрдердкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ ? рдХреНрдпрд╛ рд╣рдо рд╕рдм рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд╕рднреА рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ - рдпрд╣ рдЙрди рдЕрдиреНрдп рдореМрдЬреВрджрд╛ рд╕рд╛рдорд╛рдиреЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдЬрд┐рди рдкрд░ рд╣рдо рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрднреА рднреА рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реБрдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдХреНрдпрд╛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рдХрд╛рд░реНрдп рдХрд░реЗрдВ рдФрд░ рдРрд╕реЗред рддрдм рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рдЗрд╕реЗ рдпрд╣рд╛рдБ рд▓рд┐рдВрдХ рдХрд░рдирд╛ https://github.com/ansible/ansible/issues/16621

+1 рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдПрдХ рдмреНрд▓реЙрдХ рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдмрд╣реБрдд рдЙрд▓реНрдЯрд╛ рд╣реИред рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдерди рд╡рд╛рд▓реА рд▓реВрдк рд╡рд╛рд▓реА рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЗрддрдиреА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Ansible рдореЗрдВ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рдЙрд╕реЗ рдПрдХ рдПрдХреНрд╢рди рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдПрдХ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
https://github.com/ansible/ansible/tree/devel/lib/ansible/plugins/action

рд╕рд╛рджрд░

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХрдореА рд╣реИред Ansible рдЕрдм рддрдХ рдореЗрд░реА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдХ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╕реЗ Ansible рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ until рдХреЛ include_tasks рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ рдПрдХ рд╡рд╛рдИрдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рдерд╛ ( loop.yml ) рдФрд░ рдЦреБрдж рдХреЛ рд░рд┐рдХрд░реНрд╕рд┐рд╡рд▓реА рдХреЙрд▓ рдХрд░реЗрдВ ( recursive.yml ) рдЬрдмрдХрд┐ рд╕реНрдерд┐рддрд┐ рдЕрднреА рднреА рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

_recursive.yml:_

---

- name: 'checking {{ watch_job }} status (recursive)'
  include_tasks: 'loop.yml'

- name: 'count ({{ watch_count | int + 1 }})'
  set_fact:
    watch_count: '{{ watch_count | int + 1 }}'

- name: 'retries ({{ (watch_timeout | int / watch_poll | int) | int }})'
  set_fact:
    watch_retries: '{{ (watch_timeout | int / watch_poll | int) | int }}'

- name: 'timeout ({{ watch_timeout }} seconds)'
  fail: 
    msg: "Timeout of {{ watch_timeout }} seconds exceeded ({{ watch_retries }} retries)"
  when: (not watch_status.finished) and (watch_count | int > watch_retries | int)

- name: 'wait for {{ watch_poll }} seconds'
  wait_for:
    timeout: '{{ watch_poll | int }}'
  when: not watch_status.finished

- name: 'call itself recursively'
  include_tasks: 'recursive.yml'
  when: not watch_status.finished

рдЙрдкрд░реЛрдХреНрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ (рдпрд╣ рдПрдХ рдРрд╕реА рднреВрдорд┐рдХрд╛ рдореЗрдВ рд╣реИ рдЬреЛ рдореЗрдЬрдмрд╛рдиреЛрдВ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ )ред

рдЖрджрд░реНрд╢ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП until рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рдерд╛ред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +1!

+1

+1 рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдкрд░ рд▓реВрдк рд╣реЛрдиреЗ рддрдХ

рдореИрдВ рдмреНрд▓реЙрдХ рдкрд░ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП until (рдЕрд╕реАрдо рд░реВрдк рд╕реЗ) рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ rescue рдХреЗ рд╕рд╛рде rescue include_tasks рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛

рдореИрдВ рдирд┐рдпрдорд┐рдд until рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдИрдкреА рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд░рди рдкрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛

Wait_until_success.yml

- name: 'Wait until success'
  block:
    - name: Get server updated ip
      uri:
        url: https://localhost/ip
        return_content: yes
        status_code: 200
      register: ip

    - name: ssh to the server
      wait_for:
        host: "{{ ip }}"
        port: 22
        timeout: 30
        state: started
  rescue:
    - debug:
        msg: "Failed to connect - Retrying..."
    - include_tasks: wait_until_success.yml

рдХрдИ рдмрд╛рд░ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде @matanbaru рдХреЗ рд╕рдорд╛рди

- name: 'Wait until success'
  block:
    - name: Set the retry count
      set_fact:
        retry_count: "{{ 0 if retry_count is undefined else retry_count|int + 1 }}"

    - name: Get server updated ip
      uri:
        url: https://localhost/ip
        return_content: yes
        status_code: 200
      register: ip

    - name: ssh to the server
      wait_for:
        host: "{{ ip }}"
        port: 22
        timeout: 30
        state: started
  rescue:
    - fail:
        msg: Ended after 5 retries
      when: retry_count|int == 5

    - debug:
        msg: "Failed to connect - Retrying..."

    - include_tasks: wait_until_success.yml

+1 рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ-рд▓реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ!
рдмрд┐рд▓реНрдХреБрд▓ "рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" рд╕реБрд╡рд┐рдзрд╛!

+1

+1

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред +1 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╢реЛрд░рдЧреБрд▓ рд╡рд╛рд▓рд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

adamprato picture adamprato  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

greggilbert picture greggilbert  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rchady picture rchady  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hryamzik picture hryamzik  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

aioue picture aioue  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ