
рдЕрдм рддрдХ, рдХрдИ рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВ рддреИрдирд╛рдд рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджрд┐рди, рд╕рдкреНрддрд╛рд╣ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкреЗрдХреНрд╖рд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорд╣реАрдиреЛрдВ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдРрд╕реЗ рдХрдИ рдЙрдкрдХрд░рдг рдФрд░ рдЕрднреНрдпрд╛рд╕ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдПрдХ рдпрд╛ рджреЛ рджрд┐рдиреЛрдВ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
- рдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЙрдард╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ред рд╕рднреА рдпрд╛ рдХрдо рд╕реЗ рдХрдо рднрд╛рдЧреЛрдВ рдореЗрдВред рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рджреЗрд╡ рд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рдиреНрдпреВрдирддрдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЙрддреНрдкрд╛рдж рд╕реЗ рднрд┐рдиреНрди рд╣реЛред рдпрд╣ "рдореЗрд░реА рдорд╢реАрди рдкрд░ рдХрд╛рдо" рдХреАрдбрд╝реЗ рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛ред рд╡реИрд╕реЗ рднреА, рдЬрдм рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдФрд░ рдбреЗрдмрд┐рдпрди рдкрд░ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдкрд░реЗрд╢рд╛рдиреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдирд╣реАрдВ рдЧрд┐рди рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- рдореИрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреБрдЫ рдХрдорд╛рдВрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдорд╢реАрди рдФрд░ рдУрдПрд╕ рдкрд░ рджреЗрд╡ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХреАрдбрд╝реЗ рдХреЗ "рдореЗрд░реА рдорд╢реАрди рдкрд░ рдХрд╛рдо" рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рд╕рдордп рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рдКрдкрд░ рдЙрдареЛ рдФрд░ рдЪрд▓реЛ)ред
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рд╕рдм рд╣рдо Django рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕рд╛рд▓реНрдЯ + рд╡реИрдЧреНрд░рдВрдЯ рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдХрдиреАрдХреЗрдВ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдореЗрдВ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреАред
рддреБрд░рдВрдд рд╕реНрд░реЛрдд рдХрд╛ рд▓рд┐рдВрдХ рджреЗрдВ:
bitbucket.org/awnion/salt-django-deployрдирдордХ рдХреНрдпрд╛ рд╣реИ?
рдпрджрд┐ рдЖрдк рд╕рд╛рд▓реНрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдирдордХ рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рдмрдВрдзрди (рдХреНрд▓рд╕реНрдЯрд░ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди) рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдиреНрдпрд╛рдпрд╕рдВрдЧрдд рд╣реИ рдФрд░ рдпрд╣ рдУрд╡рд░рдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓реЗрдВ, рддреЛ рдЖрдкрдХреА рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдареАрдХ 1 рдбреЗрд╡рд▓рдкрд░ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА)ред
рд╕рд╛рд▓реНрдЯ рд╕реНрдЯреЗрдЯреНрд╕ рд╕реНрд▓реИрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА YAML рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдмрддрд╛рддреА рд╣реИрдВ рдХрд┐ рдорд╢реАрди рдХрд┐рд╕ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдпрд╣рд╛рдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╕рд╛рд▓реНрдЯ рдореЗрдВ, рдЖрдк рди рдХреЗрд╡рд▓ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ (рдЙрдкрдпреБрдХреНрдд, рдЖрд░рдкреАрдПрдо, рдХреНрд░реЛрди, рдЗрдирд┐рдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди) рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ RabbitMQ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдХреНрдпрд╛ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг, рд╕рднреА рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реИрдВ рдЕрдкрдиреЗ virtualenv рдФрд░ рдЗрддрдиреЗ рдкрд░ред рд╢рд░реНрддреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ
docs.saltstack.com/ref/states/all рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред
рдирдордХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рддрдереНрдп
- рдирдордХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рд░рд╛рдЬреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рдиреНрдЬрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рднреА DRY рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдирдордХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреНрдкрд▓, рдирд╛рд╕рд╛, рд▓рд┐рдВрдХреНрдбрдЗрди рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрдВрдкрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдирдордХ рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
- рд╕рд╛рд▓реНрдЯ рдХреЗ рд▓рд┐рдП Pdf рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рд▓рдЧрднрдЧ 1000 рдкреЗрдЬ рдХрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХрд╛рдлреА рд╕рдзреЗ рд╣реБрдП рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд┐рд╡рд░рдг рдорд┐рд▓реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдкреНрд░рдерд╛рдУрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рджреЗрд╡ рд╡рд┐рдиреНрдпрд╛рд╕
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдЕрдЪреНрдЫреЗ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рдХрдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди "рдЕрдкрдиреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рдиреЛрдВ рдпрд╛ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рд╕рдордп рднреА рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрди рджрд┐рдиреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛рдПрдВ рдФрд░ рдПрдХ рдРрд╕рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
git clone <repo_url> && cd <repo_name> && vagrant up
рдареАрдХ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 3 рдЯреАрдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЖрд╕рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореИрдВ рдЖрдкрдХрд╛ рд╣рд╛рде рд╣рд┐рд▓рд╛рддрд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдо
рд╡реИрдЧреНрд░рд╛рдВрдд рдкрд░ рдЕрдкрдиреЗ рджреЗрд╡ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡реИрдЧреНрд░рд╛рдВрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЖрдкрд╕реЗ рдорд┐рд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ):
mkdir my_app && cd my_app git init vagrant init
рд╡реИрдЧреНрд░рдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдХреЙрдиреНрдлрд┐рдЧ рд╣рдорд╛рд░реЗ my_app рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рдЕрдЧрд▓рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде
Vagrantfile рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.hostname = "dev-my-app" config.vm.network :private_network, ip: '3.3.3.3' config.vm.synced_folder "salt/roots/salt", "/srv/salt/" config.vm.synced_folder "salt/roots/pillar", "/srv/pillar/" config.vm.provision :salt do |salt| salt.minion_config = "salt/minion" salt.run_highstate = true end end
рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрдкрдХреЛ рдЙрдмрдВрдЯреВ рдкрд░ рдПрдХ рдЕрддрд┐рдерд┐ рдорд╢реАрди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрд┐рд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╣рдо рдореЗрдЬрдмрд╛рди рдирд╛рдо рдФрд░ рдЖрдИрдкреА рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдорд╢реАрди рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рд╡реИрд╕реЗ, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧреА рдЕрддрд┐рдерд┐ рдорд╢реАрди рдХреЗ / рдпреЛрдирд┐ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝)ред
рдЖрдк
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд░рд╛рдЬреНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ
рдирдордХ / рдорд┐рдирд┐рдпрди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
file_client: local
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдорд╢реАрди рдЕрдкрдиреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╣реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдирдордХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рд░рд╛рдЬреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдП, рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╣ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ / var / рдХреИрд╢ / рдирдордХ рдореЗрдВ рдХрд╣реАрдВ рднреА рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХреБрдЫ рдХрд╕реНрдЯрдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд▓реЗ рдареЗрд╕ рдорд╢реАрди рдкрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЕрдм рджреЛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:
mkdir -p salt/roots/pillar mkdir -p salt/roots/salt
рдкрд╣рд▓рд╛ рдПрдХ рд╡рд┐рднрд┐рдиреНрди рдЪрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рд╣рдорд╛рд░реЗ рдЕрддрд┐рдерд┐ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдлрд╝реЛрд▓реНрдбрд░ рд╣реИред
рдПрдХ рдлрд╝рд╛рдЗрд▓
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / top.sls рдмрдирд╛рдПрдБ base: 'dev-my-app': - nginx - python - supervisor
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдПрд╕рдПрд▓ рдпрдорд▓ рдХреЗ рд╕рдорд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдПрд▓рдПрд╕ рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд┐рдиреНрдЬрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рднреА рд╣реИ (рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдн рджреЗрддрд╛ рд╣реИ)ред
рдЖрдзрд╛рд░ рд╣рдорд╛рд░реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд░рд╛рдЬреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдирд╛рдо рд╣реИред dev-my-app рд╣рдорд╛рд░реЗ рдЧреЗрд╕реНрдЯ рдорд╢реАрди рдХрд╛ рд╣реЛрд╕реНрдЯрдирд╛рдо рд╣реИред рдпрд╣рд╛рдВ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдо 'dev- *' рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рднреА рд░рд╛рдЬреНрдп рджреЗрд╡-рдЕрд▓реНрдлрд╝рд╛, рджреЗрд╡-рдлрд╝реЛрдмрд╛рд░, рдЖрджрд┐ рдЬреИрд╕реА рд╕рднреА рдорд╢реАрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдЬрдЧрд░, рдирдЧреНрдиреЗрдХреНрд╕ рдФрд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреА рдШреЛрд╖рд┐рдд рдЕрд╡рд╕реНрдерд╛рдПрдБ рдмрдирд╛рдПрдБ:
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / рдЕрдЬрдЧрд░
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / nginx.sls
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / рд╕реБрдкрд░рд╡рд╛рдЗрдЬрд╝рд░ред sls supervisor: pkg: - installed service: - running - require: - pkg: supervisor
рддреЛ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "
рдЖрд╡рд╛рд░рд╛ " рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрдмрдВрдЯреВ рдЫрд╡рд┐ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреА рд╣реИ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдпрд╣ рдЫрд╡рд┐ рдХреИрд╢ рдореЗрдВ рдирд╣реАрдВ рд╣реИ), рд╡рд╣рд╛рдВ рдирдордХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рд░рд╛рдЬреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдЕрддрд┐рдерд┐ рдорд╢реАрди рдкрд░ рдЕрдЬрдЧрд░, рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдФрд░ рдирдЧреАрдиреЗ рд╣реИрдВред
рдЖрдк рдЗрд╕реЗ рдорд╢реАрди рдореЗрдВ рдпреЛрдирд┐ ssh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛
3.3.3.3 рдкрд░ рдЬрд╛рдХрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╣рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА:
рд╕реНрддрдВрдн рдЪрд░ рдмрдирд╛рдПрдВ:
рдирдордХ / рдЬрдбрд╝реЗрдВ / рд╕реНрддрдВрдн / рд╢реАрд░реНрд╖ред sls base: 'dev-my-app': - my-app
рдирдордХ / рдЬрдбрд╝реЗрдВ / рд╕реНрддрдВрдн / рдореЗрд░рд╛ app.sls my_app: gunicorn_bind: 127.0.0.1:8000 dns_name: dev.my-app.com venv_dir: /home/vagrant/my_app_env work_dir: /vagrant
рдкрд╣рд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╣рддреА рд╣реИ рдХрд┐ рдбреЗрд╡-рдорд╛рдп-рдРрдк рд╣реЛрд╕реНрдЯ рдХреЛ рдореЗрд░реЗ рдРрдк рдХреЙрдиреНрдлрд┐рдЧрд░ рд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдпрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд░ рд╣реИред
рдЕрдм рд╣рдорд╛рд░реЗ Django рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:
mkdir -p salt/roots/salt/my_app
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / my_app / init.sls {% set my_app = pillar['my_app'] %} my_app.venv: virtualenv.managed: - name: {{ my_app['venv_dir'] }} - system_site_packages: False - require: - pkg: python my_app.pip: pip.installed: - bin_env: {{ my_app['venv_dir'] }} - names: - Django==1.6 - gunicorn==18.0 - require: - virtualenv: my_app.venv my_app.nginx.conf: file.managed: - name: /etc/nginx/sites-enabled/my_app.conf - source: salt://my_app/nginx.my_app.conf - context:
рд╕рдВрдХреЗрдд : рдЬрдм рдирд┐рд░реНрднрд░рддрд╛, рдЖрд╡рд╢реНрдпрдХрддрд╛, рдШрдбрд╝реА рдЖрджрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд▓рддреА рдХреА, рдФрд░ django рдФрд░ gunicorn рд╕рдВрдХреБрд▓ рдиреЗ рдЕрднреА рддрдХ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИред
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / my_app / nginx.my_app.conf server { listen 80; server_name {{ dns_name }} _; location / { proxy_pass http://{{ bind }}; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
рдирдордХ / рдЬрдбрд╝реЗрдВ / рдирдордХ / my_app / рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ .my_app.conf [program:{{ app_name }}] command={{ gunicorn }} {{ app_name }}.wsgi:application -b {{ bind }} -w {{ workers }} directory={{ directory }} user=nobody autostart=true autorestart=true redirect_stderr=true
рдирдП рдмрдирд╛рдП рдЧрдП рд░рд╛рдЬреНрдп рдХреЛ
рдирдордХ / рдЬрдбрд╝реЛрдВ / рдирдордХ / top.sls рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ base: 'dev-my-app': - nginx - python - supervisor - my_app
рд╣рдо рд▓рдЧрднрдЧ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ - рд╣рдорд╛рд░реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ Django рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдХреЛрдбред рдЪрд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рдЯреЗрд╕реНрдЯ Django рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ:
vagrant provision
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрдИ рдорд┐рдирдЯ рд▓рдЧреЗрдВрдЧреЗ (рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп django рдФрд░ gunicorn рдХреЛ virtualenv рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
рдЬрдм рдкреНрд░рд╛рд╡рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрддрд┐рдерд┐ рдорд╢реАрди рдкрд░ рдЬрд╛рдПрдВ:
vagrant ssh
рдФрд░ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:
/home/vagrant/my_app_env/bin/django-admin.py startproject my_app /vagrant exit
рдФрд░ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдкрд░ рдлрд┐рд░ рд╕реЗ,
рдпреЛрдирд┐ рдкреНрд░рд╛рд╡рдзрд╛рди рдХрд░реЗрдВ , рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рд╣реЛрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗрдВ:
dev.my-app.com 3.3.3.3
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ
dev.my-app.com рдкрд░ рдЬрд╛рдПрдВ, рдФрд░ рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ!рджреЗрд╡ рд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рд░реНрдорд┐рдд рд╣реИред рдЖрдк рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ рджреЛрд╕реНрдд рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рдХреЗрд╡рд▓
git рдХреНрд▓реЛрди рдФрд░
рд╡реИрдЬрд╛рдЗрдирд▓ рдЕрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдХрд╛рд▓реНрдкрдирд┐рдХ рджреЛрд╕реНрдд рдХреЛ рди рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ gunicorn + рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдШреВрдорддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рджреВрд░ рд╕реЗ рд░рд┐рдореЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рд╣рдо рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдСрдЯреЛрд░реЗрд▓реЛрдб рдХреЛрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ:
vagrant ssh supervisorctl stop my_app /home/vagrant/my_app_env/bin/python /vagrant/manage.py runserver
рдЕрдм рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди django рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рдП рдЬрд╛рдПрдВрдЧреЗред
рдФрд░ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрдЬрдмрд╛рди рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ
рдЯреНрд╡рд┐рдХ рд╣реИ , рддреЛ рд╡рд╣реА django рд╕рд░реНрд╡рд░
dev.my-app.com рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм
рджреЗрдЧрд╛ ред
рдЙрддреНрдкрд╛рджрди рд╡рд┐рдиреНрдпрд╛рд╕
рддреЛ рд╣рдо рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ рд╣реИред рд╣рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкреНрд░реЛрдбрдХреНрдЯ-рдорд╛рдп-рдРрдк рдкрд░ рддреИрдирд╛рдд рд╣реЛрдВрдЧреЗред
рдЕрдЧрд▓рд╛, рд╣рдо рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддреИрдирд╛рддреА рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдордХ-рдорд╛рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рд╣реИ (рдЗрд╕рдХреЗ рдмрд╛рдж рдмрд╕ рдПрдХ рдорд╛рд╕реНрдЯрд░)ред
рдорд╛рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ,
/srv/salt/top.sls рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
'prod-my-app': - nginx - python - supervisor - my_app
рдпрд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
base: '*-my-app': - nginx - python - supervisor - my_app
рдЗрд╕рдХреЗ рдмрд╛рдж
/srv/pillar/top.sls рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ
base: '*-my-app': - my-app
/Srv/pillar/my_app.sls рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд▓реЗрдЖрдЙрдЯ рдореИрдк рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪрд░ рдмрджрд▓рддреЗ рд╣реИрдВред
рдареЗрд╕-рдореЗрд░реА-рдРрдк рдкрд░ рдирдордХ-рдорд┐рдирд┐рдпрди рд╕реЗрдЯ рдХрд░реЗрдВред рд╣рдо рдирдордХ-рдорд┐рдирд┐рдпрди рдХреЛ рдирдордХ-рдорд╛рд╕реНрдЯрд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (
рдпрд╣рд╛рдВ рдкрдврд╝реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ)ред
рдЕрдм рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдкрд░ рдЖрдк рдХреЙрдиреНрдлрд┐рдЧ рдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
sudo salt prod-my-app state.highstate
рдХреНрдпрд╛ рдмрдЪрд╛ рд╣реИ:
рдорд╛рд╕реНрдЯрд░ рдХреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдбрд┐рд▓реАрд╡рд░реА
Rsync рд╕реЗ git рддрдХ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдЖрдкрдХреА рдШрд░реЗрд▓реВ рдиреАрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдареЗрд╕-рдореЗрд░реА рдРрдк рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрддреЛрдВ рдХреА рдбрд┐рд▓реАрд╡рд░реА
рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдпрд╣ рдХрд░рддрд╛ рд╣реВрдВ: рдирдордХ рдХреЗ рд╕рд╛рде рдореИрдВ рдареЗрд╕-рдореЗрд░реА-рдРрдк рдкрд░ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдмрджреНрдз рдкрд░ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣реИрд╢ рд╕реНрддрдВрдн рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдирдордХ рдХрд╛рдо рдХреЗ рдЕрдВрдд рдореЗрдВ рддреИрдирд╛рддреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИред
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдБ, рдпрд╛ рдПрдХ рдирд┐рдЬреА pypi рдмрдврд╝рд╛рдПрдБред
рд╕рдВрджрд░реНрдн
www.saltstack.comwww.vagrantup.comhynek.me/talks/python-deployments рдПрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд▓реЗрдЦ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдЬрдЧрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рддреИрдирд╛рддреА рдкрд░ рд╕рд╛рд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдкреБрдирд╢реНрдЪрджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЕрдиреНрдпрдерд╛ рд▓реЗрдЦ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдпрд╛ рддреЛ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВред