рдпрд╣ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдПрдХрд▓ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓реВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдорддрджрд╛рди рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдЖрдк рдЗрд╕ рдкреНрд░рдЧрддрд┐ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдмреИрдХрдПрдВрдб рдкрд░ рдзрдХреНрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- 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 }}'
рдЗрд╕рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧ рд╣реИрдВред
рд╕рд╛рд░
@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
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╢реЛрд░рдЧреБрд▓ рд╡рд╛рд▓рд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдПрдХ рдмреНрд▓реЙрдХ рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдмрд╣реБрдд рдЙрд▓реНрдЯрд╛ рд╣реИред рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдерди рд╡рд╛рд▓реА рд▓реВрдк рд╡рд╛рд▓реА рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЗрддрдиреА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред