ሊቻሉ የሚችሉ መሠረታዊ ነገሮች፣ ያለዚህ የመጫወቻ መጽሐፍትዎ የተጣበቁ ፓስታዎች ናቸው።

ለሌሎች ሰዎች Ansible ኮድ ብዙ ግምገማዎችን አደርጋለሁ እና እኔ ራሴ ብዙ እጽፋለሁ። ስህተቶቹን (የሌሎችንም ሆነ የራሴን) እንዲሁም የተወሰኑ ቃለ-መጠይቆችን በመተንተን ሂደት ውስጥ የአንሲብል ተጠቃሚዎች የሚያደርጉትን ዋና ስህተት ተገነዘብኩ - ዋናውን ሳይማሩ ወደ ውስብስብው ውስጥ ይወጣሉ።

ይህንን ሁለንተናዊ ኢፍትሃዊነት ለማስተካከል፣ ቀድሞውንም ለሚያውቁት ለአንሲቪል መግቢያ ለመጻፍ ወሰንኩ። አስጠነቅቃችኋለሁ፣ ይህ የማና ንግግር አይደለም፣ ይህ ብዙ ፊደሎች የሌሉበት እና ምንም ስዕሎች የሌሉበት ረጅም ንባብ ነው።

የአንባቢው የሚጠበቀው ደረጃ በሺዎች የሚቆጠሩ የያምል መስመሮች ተጽፈዋል, የሆነ ነገር ቀድሞውኑ በማምረት ላይ ነው, ነገር ግን "በሆነ መልኩ ሁሉም ነገር ጠማማ ነው."

ስሞች

የAsible ተጠቃሚ ዋናው ስህተት ምን ተብሎ እንደሚጠራ አለማወቁ ነው። ስሞቹን ካላወቁ በሰነዱ ውስጥ የተጻፈውን መረዳት አይችሉም. ሕያው ምሳሌ፡ በቃለ መጠይቅ አንድ ሰው በአንሲብል ብዙ እንደፃፈ የገለፀ የሚመስለው ሰው "መጫወቻ መጽሐፍ ምንን ያካትታል?" የሚለውን ጥያቄ መመለስ አልቻለም። እናም "መልሱ የሚጠበቀው የጨዋታ መፅሃፉ ጨዋታን ያካተተ ነው" ብዬ ሀሳብ ሳቀርብ ገዳዩ "አንጠቀምበትም" የሚል አስተያየት ተከተለ። ሰዎች ለገንዘብ Ansible ብለው ይጽፋሉ እና ጨዋታን አይጠቀሙም። እነሱ በትክክል ይጠቀማሉ, ግን ምን እንደሆነ አያውቁም.

ስለዚህ በቀላል እንጀምር፡ ምን ይባላል። ምናልባት ይህን ያውቁ ይሆናል ወይም ላያውቁት ይችላሉ, ምክንያቱም ሰነዶቹን ሲያነቡ ትኩረት አልሰጡም.

asible-playbook የመጫወቻ መጽሐፍን ያስፈጽማል. Playbook እንደዚህ ያለ ነገር ያለው የyml/yaml ፋይል ነው፡-

---
- hosts: group1
  roles:
    - role1

- hosts: group2,group3
  tasks:
    - debug:

ይህ ሙሉ ፋይል የመጫወቻ መጽሐፍ መሆኑን አስቀድመን ተረድተናል። ሚናዎቹ የት እንዳሉ፣ ተግባሮቹ የት እንዳሉ ማሳየት እንችላለን። ግን ጨዋታ የት ነው? እና ጨዋታ ከ ሚና ወይም ጨዋታ መጽሐፍ የሚለየው እንዴት ነው?

ሁሉም በሰነድ ውስጥ ነው። እና ተዘሏል. ጀማሪዎች - በጣም ብዙ ስለሆኑ እና ሁሉንም ነገር በአንድ ጊዜ ማስታወስ አይችሉም. ልምድ ያለው - ምክንያቱም "ትናንሽ ነገሮች." ልምድ ካሎት እነዚህን ገጾች ቢያንስ በየአመቱ አንድ ጊዜ እንደገና ያንብቡ እና ኮድዎ የተሻለ ክፍል ይሆናል።

ስለዚህ ያስታውሱ፡ የመጫወቻ መጽሐፍ የጨዋታ ዝርዝር እና import_playbook.
ይህ አንድ ጨዋታ ነው፡-

- hosts: group1
  roles:
    - role1

ይህ ደግሞ ሌላ ጨዋታ ነው።

- hosts: group2,group3
  tasks:
    - debug:

ጨዋታ ምንድን ነው? ለምንድነዉ?

መጫወት የመጫወቻ መጽሐፍ ቁልፍ አካል ነው ምክንያቱም መጫወት እና መጫወት የሚናዎችን እና/ወይም ተግባሮችን ዝርዝር ከአስተናጋጆች ዝርዝር ጋር ስለሚያቆራኝ ነው። በሰነዶቹ ጥልቅ አንጀት ውስጥ, መጠቀሱን ማግኘት ይችላሉ delegate_to፣ የአካባቢ ፍለጋ ተሰኪዎች ፣ የአውታረ መረብ-ክሊ-ተኮር መቼቶች ፣ አስተናጋጆች መዝለል ፣ ወዘተ. የተግባሮችን አፈፃፀም ቦታ በትንሹ እንዲቀይሩ ያስችሉዎታል። ነገር ግን ስለሱ ይረሱት። እያንዳንዳቸው እነዚህ አስቸጋሪ አማራጮች በጣም ልዩ አጠቃቀሞች አሏቸው ፣ እና እነሱ በእርግጠኝነት ሁለንተናዊ አይደሉም። እና እያወራን ያለነው ሁሉም ሰው ሊያውቀው እና ሊጠቀምባቸው ስለሚገባቸው መሰረታዊ ነገሮች ነው።

"አንድ ነገር" "አንድ ቦታ" ማከናወን ከፈለጉ - ጨዋታን ይጽፋሉ. ሚና አይደለም። ከሞጁሎች እና ተወካዮች ጋር ሚና አይደለም. ጨዋታን ወስደህ ጻፍ። በየትኛው ፣ በአስተናጋጆች መስክ ፣ የት እንደሚፈፀም ይዘረዝራሉ ፣ እና ሚናዎች / ተግባራት - ምን እንደሚፈፀም።

በቃ፣ ትክክል? እና ሌላ እንዴት ሊሆን ይችላል?

ሰዎች በጨዋታ ሳይሆን ለማድረግ ፍላጎት ካላቸው ባህሪያቸው አንዱ "ሁሉንም ነገር የሚያዘጋጀው ሚና" ነው. የመጀመሪያውን አይነት ሁለቱንም አገልጋዮች እና የሁለተኛው አይነት አገልጋዮችን የሚያዋቅር ሚና እንዲኖረኝ እፈልጋለሁ።

አንድ ዋና ምሳሌ ክትትል ነው. ክትትልን የሚያዘጋጅ የክትትል ሚና እንዲኖረኝ እፈልጋለሁ። የክትትል ሚናው አስተናጋጆችን ለመከታተል ተመድቧል (acc. play)። ነገር ግን፣ ለመከታተል በምንከታተላቸው አስተናጋጆች ላይ ፓኬጆችን ማስቀመጥ አለብን። ለምን ተወካይ አትጠቀምም? እንዲሁም iptables ማዋቀር ያስፈልግዎታል. ተወካዩ? እና አሁንም ክትትል የጀመረውን የዲቢኤምኤስ አወቃቀር መፃፍ/ማረም ያስፈልጋል። ተወካይ! እና ፈጠራው ብቅ ካለ, ውክልና ማድረግ ይችላሉ include_role በቡድን ዝርዝር ውስጥ እና በውስጥም በተጣበቀ ማጣሪያ በኩል በተሸፈነ ዑደት ውስጥ include_role የበለጠ ማድረግ ትችላለህ delegate_to እንደገና። እና እንሄዳለን ...

መልካም ምኞት - "ሁሉንም የሚያደርግ" አንድ ነጠላ የክትትል ሚና እንዲኖረን - ብዙውን ጊዜ አንድ መውጫ ወደሚገኝበት ገሃነም ይመራናል ሁሉንም ነገር ከባዶ እንደገና ይፃፉ።

ስህተቱ የት ደረሰ? በአስተናጋጅ X ላይ “x”ን ለመፈፀም ወደ ዋይ ሄደህ “y” ማድረግ እንዳለብህ ባወቅህ ቅጽበት፣ ቀላል ልምምድ ማድረግ ነበረብህ፡ ሂድ እና በአስተናጋጅ Y ላይ y የሚያደርግ ተውኔት ጻፍ። የሆነ ነገር በ "x" ላይ አትጨምሩ, ነገር ግን ከባዶ ይፃፉ. በሃርድ ኮድ የተቀመጡ ተለዋዋጮች እንኳን።

ከላይ ባሉት አንቀጾች ውስጥ ሁሉም ነገር ትክክል ይመስላል. ግን ይህ የእርስዎ ጉዳይ አይደለም! ድጋሚ ጥቅም ላይ ሊውል የሚችል ኮድ መጻፍ ስለምትፈልጉ እና እንደ ቤተ-መጽሐፍት አይነት እና ይህን ለማድረግ የሚያስችል መንገድ መፈለግ አለብዎት።

ሌላ ትልቅ ስህተት እዚህ አለ። ብዙ ፕሮጄክቶችን በመቻቻል ከተፃፉ (የተሻለ ሊሆን ይችላል ፣ ግን ሁሉም ነገር ይሰራል እና ለመጨመር ቀላል ነው) ደራሲው እንኳን ሊገነዘበው ወደማይችለው አስፈሪነት ያመጣ ስህተት። ይሰራል ነገር ግን እግዚአብሔር ለውጥን ይከለክላል።

ይህ ስህተት እንደዚህ ይመስላል፡ ሚና የቤተ መፃህፍት ተግባር ነው። ይህ ተመሳሳይነት ብዙ ጥሩ ጅምሮችን አበላሽቷል ስለዚህም መመልከት በጣም ያሳዝናል። ሚና የቤተ-መጽሐፍት ተግባር አይደለም። እሷ ስሌት ማድረግ አትችልም እና የጨዋታ ደረጃ ውሳኔዎችን ማድረግ አትችልም. ጨዋታ ምን ውሳኔዎችን እንደሚያደርግ አስታውሰኝ?

አመሰግናለሁ፣ ልክ ነህ። ጨዋታ በየትኞቹ አስተናጋጆች ላይ የትኛውን ተግባራት እና ሚናዎች ማከናወን እንዳለበት ውሳኔ ይሰጣል (ይበልጥ በትክክል፣ መረጃ ይዟል)።

ይህንን ውሳኔ ለአንድ ሚና ከሰጡት፣ እና በስሌቶችም ቢሆን፣ እራሳችሁን (እና ኮድዎ ሊተነተን የሚሞክርን ሰው) ወደ አሳዛኝ ህልውና ትጠፋላችሁ። ሚናው የት እንደሚያስኬድ አይወስንም. ይህ ውሳኔ የሚከናወነው በጨዋታ ነው። ሚናው የታዘዘውን፣ በተነገረበት ቦታ ያደርጋል።

በ Ansible ፕሮግራሚንግ ለምን አደገኛ እንደሆነ እና COBOL ከአንሲል እንዴት እንደሚሻል፣ በተለዋዋጭ እና በጂንጃ ላይ በምዕራፉ ውስጥ እንነጋገራለን። ለአሁን፣ አንድ ነገር እንበል - እያንዳንዱ ስሌትህ ዓለም አቀፋዊ ተለዋዋጮችን ለመለወጥ የማይጠፋ ዱካ ትቶታል፣ እና ምንም ማድረግ አትችልም። ሁለቱ "ዱካዎች" እንደተሻገሩ ሁሉም ነገር ጠፍቷል።

ለቆርቆሮው ማስታወሻ: ሚናው, በእርግጥ, የመቆጣጠሪያውን ፍሰት ሊጎዳ ይችላል. ብላ delegate_to እና ምክንያታዊ አጠቃቀሞች አሉት. ብላ meta: end host/play. ግን! መሰረታዊ ነገሮችን እንደምናስተምር አስታውስ? ስለ ረሳው delegate_to. እየተነጋገርን ያለነው ስለ ቀላሉ እና በጣም ቆንጆው Ansible code ነው። የትኛው ለማንበብ ቀላል ፣ ለመፃፍ ቀላል ፣ ለማረም ቀላል ፣ ለመፈተሽ ቀላል እና ለመፃፍ ቀላል የሆነው። ስለዚህ አንድ ተጨማሪ ጊዜ፡-

መጫወት እና ጨዋታ ብቻ የትኛውን አስተናጋጅ እንደሚፈጽም ይወስናል።

በዚህ ክፍል የጨዋታ እና የሚና ተቃውሞን አስተናግደናል። አሁን ስለ ተግባሮቹ እና ስለ ሚና ግንኙነት እንነጋገር።

ተግባራት እና ሚናዎች

ጨዋታን አስቡበት፡-

- hosts: somegroup
  pre_tasks:
    - some_tasks1:
  roles:
     - role1
     - role2
  post_tasks:
     - some_task2:
     - some_task3:

foo ማድረግ ያስፈልግዎታል እንበል። እና ይመስላል foo: name=foobar state=present. የት ነው መጻፍ ያለበት? በቅድመ? ልጥፍ? ሚና ይፈጠር?

… እና ተግባሮቹ የት ሄዱ?

በመሠረታዊ ነገሮች - በመጫወቻ መሳሪያው እንደገና እንጀምራለን. በዚህ ዙሪያ እየተንሳፈፉ ከሆነ, ጨዋታን ለሌላው ነገር መሰረት አድርገው መጠቀም አይችሉም, እና የእርስዎ ውጤት "አስፈሪ" ነው.

የመጫወቻው መሣሪያ፡ የአስተናጋጆች መመሪያ፣ ለጨዋታው ራሱ ቅንጅቶች እና ቅድመ_ተግባራት፣ ተግባሮች፣ ሚናዎች፣ የድህረ_ተግባራት ክፍል። የቀሩት የጨዋታ መለኪያዎች አሁን ለእኛ አስፈላጊ አይደሉም።

የክፍሎቻቸው ቅደም ተከተል ከተግባሮች እና ሚናዎች ጋር፡- pre_tasks, roles, tasks, post_tasks. ጀምሮ, በፍቺ, መካከል የአፈጻጸም ቅደም ተከተል tasks и roles ግልጽ አይደለም, ከዚያ ምርጥ ልምዶች ክፍል እየጨመርን ነው ይላሉ tasksካልሆነ ብቻ roles... ካለ roles, ከዚያም ሁሉም የተያያዙ ስራዎች በክፍሎቹ ውስጥ ይቀመጣሉ pre_tasks/post_tasks.

ሁሉም ነገር በትርጉም ግልጽ ሆኖ ብቻ ይቀራል-መጀመሪያ pre_tasks, ከዚያ roles, ከዚያ post_tasks.

ግን አሁንም ለጥያቄው መልስ አልሰጠንም-የሞጁል ጥሪው የት ነው foo መጻፍ? ለእያንዳንዱ ሞጁል ሙሉ ሚና መፃፍ አለብን? ወይም ለሁሉም ነገር ወፍራም ሚና ቢኖረው ይሻላል? እና ሚና ካልሆነ ፣ ከዚያ የት እንደሚፃፍ - በቅድመ ወይም በፖስታ?

ለእነዚህ ጥያቄዎች ምክንያታዊ መልስ ከሌለ ይህ የእውቀት እጥረት ምልክት ነው ፣ ማለትም እነዚያ በጣም “የሚንቀጠቀጡ መሠረቶች”። እስቲ እንገምተው። በመጀመሪያ የደህንነት ጥያቄ፡ ጨዋታው ካለ pre_tasks и post_tasks (እና ተግባሮችም ሆነ ሚናዎች የሉም) ፣ ከዚያ መጀመሪያ ከተንቀሳቀስኩ የሆነ ነገር ሊሰበር ይችላል። post_tasks ወደ መጨረሻው መንቀሳቀስ pre_tasks?

እርግጥ ነው, የጥያቄው አጻጻፍ እንደሚፈርስ ፍንጭ ይሰጣል. ግን በትክክል ምንድን ነው?

… ተቆጣጣሪዎች። መሰረታዊ ነገሮችን ማንበብ አንድ አስፈላጊ እውነታ ያሳያል-ሁሉም ተቆጣጣሪዎች ከእያንዳንዱ ክፍል በኋላ በራስ-ሰር ይታጠባሉ። እነዚያ። ሁሉም ተግባራት ከ pre_tasks, ከዚያም ሁሉም ተቆጣጣሪዎች ያሳወቁት. ከዚያ ሁሉም ሚናዎች እና በሚናዎች ውስጥ ያሳወቁት ሁሉም ተቆጣጣሪዎች ይፈጸማሉ። በኋላ post_tasks እና ተቆጣጣሪዎቻቸው.

እንደዚህ, አንድ ተግባር ከ ጎትተው ከሆነ post_tasks в pre_tasks, ከዚያ ተቆጣጣሪው ከመፈጸሙ በፊት ሊፈጽሙት ይችላሉ. ለምሳሌ, ከገባ pre_tasks የድር አገልጋዩን መጫን እና ማዋቀር፣ እና post_tasks የሆነ ነገር ወደ እሱ ይላካል, ከዚያም የዚህን ተግባር ወደ ክፍል ማስተላለፍ pre_tasks ወደ እውነታ ይመራል "በመላክ" ጊዜ አገልጋዩ ገና አልተጀመረም እና ሁሉም ነገር ይቋረጣል.

አሁን ለምን እንደ ገና እናስብ pre_tasks и post_tasks? ለምሳሌ, ሚናው ከመፈጸሙ በፊት አስፈላጊውን ሁሉ (ተቆጣጣሪዎችን ጨምሮ) ለማከናወን. ሀ post_tasks ሚናዎችን በማስፈጸም ውጤት (ተቆጣጣሪዎችን ጨምሮ) እንድንሰራ ያስችለናል።

አዋቂ ምን እንደሆነ ይነግሩናል። meta: flush_handlersነገር ግን በጨዋታው ውስጥ ባሉት ክፍሎች አፈጻጸም ላይ መተማመን ስንችል ለምን flush_handlers ያስፈልገናል? በተጨማሪም የሜታ አጠቃቀም፡ flush_handlers ያልተጠበቁ ነገሮችን በተደጋጋሚ ተቆጣጣሪዎች ሊያደርሱልን ይችላሉ፣ ስንጠቀምም እንግዳ የሆኑ ማስጠንቀቂያዎችን ይሰጡናል። when у block ወዘተ. ሊቻል የሚችለውን በተሻለ ባወቁ ቁጥር ለ"አስቸጋሪ" መፍትሄ መሰየም የምትችላቸው ብዙ ውዝግቦች ይሆናሉ። እና ቀላል መፍትሄ - በቅድመ / ሚናዎች / ልጥፍ መካከል ተፈጥሯዊ መለያየትን በመጠቀም - ልዩነቶችን አያመጣም።

እና ወደ እኛ 'ፉ' እንመለስ። የት ነው ማስቀመጥ? በቅድመ፣ ልጥፍ ወይስ ሚናዎች? በግልጽ ለማየት እንደሚቻለው, ይህ የተቆጣጣሪውን ውጤት ለ foo እንደምንፈልግ ይወሰናል. እነሱ ከሌሉ ፣ ከዚያ foo በቅድመም ሆነ በፖስታ ውስጥ ማስገባት አያስፈልግም - እነዚህ ክፍሎች ልዩ ትርጉም አላቸው - ከዋናው ኮድ ድርድር በፊት እና በኋላ ተግባራትን ማከናወን።

አሁን "ሚና ወይም ተግባር" ለሚለው ጥያቄ መልሱ ቀድሞውኑ በጨዋታው ውስጥ ወደነበረው ይወርዳል - ተግባራት ካሉ, ወደ ተግባራት መጨመር ያስፈልግዎታል. ሚናዎች ካሉ, ሚና መጫወት ያስፈልግዎታል (ከአንድ ተግባር ቢሆንም). ተግባራት እና ሚናዎች በተመሳሳይ ጊዜ ጥቅም ላይ እንደማይውሉ አስታውሳችኋለሁ.

የአንሲቪል መሰረታዊ ነገሮችን መረዳት ለጣዕም ለሚመስሉ ጥያቄዎች ምክንያታዊ መልሶችን ይሰጣል።

ተግባራት እና ሚናዎች (ክፍል ሁለት)

አሁን የመጫወቻ መጽሐፍ መጻፍ ሲጀምሩ ሁኔታውን እንወያይ. ፎ, ባር እና ባዝ መስራት ያስፈልግዎታል. እነዚህ ሶስት ተግባራት ናቸው አንድ ሚና ወይስ ሶስት ሚናዎች? ጥያቄውን ማጠቃለል-በየትኛው ነጥብ ላይ ሚናዎችን መጻፍ መጀመር አለብዎት? ተግባራትን መፃፍ ሲችሉ ሚናዎችን የመፃፍ ፋይዳ ምንድን ነው? ... እና ሚና ምንድን ነው?

ከትልቅ ስህተቶች አንዱ (ስለዚህ ጉዳይ ተናግሬአለሁ) ሚና በፕሮግራሙ ላይብረሪ ውስጥ እንዳለ ተግባር ነው ብሎ ማሰብ ነው። የአንድ ተግባር አጠቃላይ መግለጫ ምን ይመስላል? የግቤት ነጋሪ እሴቶችን ይወስዳል ፣ ከጎን ምክንያቶች ጋር ይገናኛል ፣ የጎንዮሽ ጉዳቶችን ያደርጋል ፣ እሴት ይመልሳል።

አሁን, ትኩረት. በዚህ ሚና ውስጥ ምን ሊደረግ ይችላል? የጎንዮሽ ጉዳቶችን ይደውሉ - ሁል ጊዜ እንኳን ደህና መጡ ፣ ይህ የጠቅላላው ዋና ነገር ነው - የጎንዮሽ ጉዳቶችን ማድረግ። የጎን ምክንያቶች አሉዎት? የመጀመሪያ ደረጃ. ነገር ግን "እሴትን አሳልፈህ መልሰህ" - እሱ የሌለበት ነው. በመጀመሪያ፣ ለአንድ ሚና እሴት ማስተላለፍ አይችሉም። ለ ሚናው በቫርስ ክፍል ውስጥ የህይወት ዘመን የመጠን ጨዋታ ያለው ዓለም አቀፍ ተለዋዋጭ ማዘጋጀት ይችላሉ። በአንድ ሚና ውስጥ የህይወት ዘመንን በመጫወት ዓለም አቀፍ ተለዋዋጭ ማዘጋጀት ይችላሉ። ወይም በሕይወት ዘመናቸው የመጫወቻ መጽሐፍም ቢሆን (set_fact/register). ነገር ግን "አካባቢያዊ ተለዋዋጮች" ሊኖርዎት አይችልም. "እሴት መውሰድ" እና "መመለስ" አይችሉም.

ዋናው ነገር ከዚህ የሚከተለው ነው-በአንችለር ላይ አንድ ነገር መጻፍ አይችሉም እና የጎንዮሽ ጉዳቶችን አያስከትሉ. አለምአቀፍ ተለዋዋጮችን መቀየር ሁልጊዜ ለአንድ ተግባር የጎንዮሽ ጉዳት ነው። በ Rust ውስጥ, ለምሳሌ, ዓለም አቀፍ ተለዋዋጭ መለወጥ ነው unsafe. እና በተመጣጣኝ - ሚና እሴቶች ላይ ተጽዕኖ ለማድረግ ብቸኛው መንገድ። ጥቅም ላይ ለሚውሉት ቃላቶች ትኩረት ይስጡ: "እሴትን ወደ ሚና አሳልፉ" ሳይሆን " ሚናው የሚጠቀምባቸውን እሴቶች ይለውጡ". ሚናዎች መካከል ምንም ማግለል የለም. በተግባሮች እና ሚናዎች መካከል ምንም ልዩነት የለም.

ጠቅላላ: ሚና ተግባር አይደለም።.

ስለ ሚና ምን ጥሩ ነገር አለ? በመጀመሪያ ፣ ሚናው ነባሪ እሴቶች አሉት (/default/main.yaml), በሁለተኛ ደረጃ, ሚናው ፋይሎችን ለማጣጠፍ ተጨማሪ ማውጫዎች አሉት.

ነባሪ ዋጋዎች ለምን ጥሩ ናቸው? በ Maslow's ፒራሚድ ውስጥ፣ Ansible's ይልቁንም ጠማማ ተለዋዋጭ የቅድሚያ ሠንጠረዥ፣ ሚና ነባሪዎች ከሁሉም በላይ ቅድሚያ የማይሰጡ መሆናቸው ነው (ከሚቻል የትእዛዝ መስመር መለኪያዎች በስተቀር)። ይህ ማለት ነባሪ እሴቶችን ማቅረብ ከፈለጉ እና የእቃ ወይም የቡድን ተለዋዋጮችን ስለሚሻሩ መጨነቅ ካልፈለጉ ሚና ነባሪዎች ለእርስዎ ብቸኛው ትክክለኛ ቦታ ናቸው። (ትንሽ እዋሻለሁ - ተጨማሪ አለ። |d(your_default_here), ነገር ግን ስለ ቋሚ ቦታዎች ከተነጋገርን, ከዚያም የተግባሮች ነባሪዎች ብቻ).

ስለ ሚናዎች ሌላ ምን ጥሩ ነገር አለ? የራሳቸው ማውጫዎች ስላላቸው ነው። እነዚህ ለተለዋዋጮች ማውጫዎች ናቸው፣ ሁለቱም ቋሚ (ማለትም ለሚናው የተሰላ) እና ተለዋዋጭ (እንዲህ ያለ ስርዓተ-ጥለት ወይም ፀረ-ንድፍ አለ - include_vars አንድ ላይ {{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml.) እነዚህ ለ ማውጫዎች ናቸው። files/, templates/. እንዲሁም የእራስዎ ሞጁሎች እና ተሰኪዎች ሚናዎች እንዲኖሩዎት ይፈቅድልዎታል (library/). ነገር ግን፣ ከመጫወቻ መጽሃፉ ተግባራት ጋር በማነፃፀር (ይህ ሁሉ ሊኖረውም ይችላል) እዚህ ያለው ብቸኛው ጥቅም ፋይሎቹ ወደ አንድ ክምር አለመጣሉ ነው ፣ ግን ብዙ የተለያዩ ክምር።

አንድ ተጨማሪ ዝርዝር፡ ለእንደገና ጥቅም ላይ የሚውሉ ሚናዎችን ለመስራት መሞከር ትችላለህ (በጋላክሲ በኩል)። ክምችቶች ከመጡ በኋላ, ሚናዎች ስርጭት እንደ ተረሳ ሊቆጠር ይችላል.

ስለዚህ, ሚናዎች ሁለት ጠቃሚ ባህሪያት አሏቸው: ነባሪዎች (ልዩ ባህሪ) አላቸው እና ኮድዎን እንዲያዋቅሩ ያስችሉዎታል.

ወደ መጀመሪያው ጥያቄ ስንመለስ፡ ተግባራት መቼ እና መቼ ሚናዎች እንደሚሰሩ? በመጫወቻ ደብተር ውስጥ ያሉ ተግባራት አብዛኛውን ጊዜ ጥቅም ላይ የሚውሉት ከ ሚናዎች በፊት/በኋላ እንደ "ሙጫ" ወይም እንደ ገለልተኛ የግንባታ አካል ነው (ከዚያም በኮዱ ውስጥ ምንም ሚናዎች ሊኖሩ አይገባም)። የመደበኛ ስራዎች ክምር ከተናዎች ጋር ተደባልቆ የማያሻማ ስድብ ነው። አንድ የተወሰነ ዘይቤን - ተግባሮችን ወይም ሚናዎችን ማክበር አለብዎት። ሚናዎች የአካል ክፍሎችን እና ነባሪዎችን መለያየት ይሰጣሉ ፣ ተግባሮች ኮዱን በፍጥነት እንዲያነቡ ያስችሉዎታል። ብዙውን ጊዜ, ተጨማሪ "የቋሚ" (አስፈላጊ እና ውስብስብ) ኮድ በሚናው ውስጥ ይወጣል, እና ረዳት ስክሪፕቶች በተግባሮች ዘይቤ ይጻፋሉ.

እንደ ተግባር አስመጪ_ሮልን ማድረግ ይቻላል፣ ነገር ግን ይህን ከፃፉ፣ ለምን ይህን ለማድረግ እንደፈለጋችሁ ለራስህ የውበት ስሜት ማብራሪያ ተዘጋጅ።

አስተዋይ አንባቢ ሚናዎች ሚናዎችን ማስመጣት፣ ሚናዎች በ galaxy.yml በኩል ጥገኛ ሊሆኑ ይችላሉ፣ እና ከዚያ አስፈሪ እና አስፈሪው አለ ሊል ይችላል። include_role - በሥዕል ጂምናስቲክ ሳይሆን በመሠረታዊ Ansible ውስጥ ችሎታዎችን እንደምናሻሽል አስታውሳችኋለሁ።

ተቆጣጣሪዎች እና ተግባራት

አንድ ተጨማሪ ግልጽ ነገር እንወያይ፡ ተቆጣጣሪዎች። በትክክል እንዴት እንደሚጠቀሙባቸው ማወቅ ጥበብ ነው ማለት ይቻላል። በአስተዳዳሪ እና በተግባሩ መካከል ያለው ልዩነት ምንድን ነው?

መሰረታዊ ነገሮችን ስለምናስታውስ፣ አንድ ምሳሌ እዚህ አለ፡-

- hosts: group1
  tasks:
    - foo:
      notify: handler1
  handlers:
     - name: handler1
       bar:

የሚናው ተቆጣጣሪዎች በሮል ስም/አሳዳጊ/ዋና.ያማል ናቸው። ተቆጣጣሪዎች በጨዋታው ውስጥ ባሉ ሁሉም ተሳታፊዎች መካከል ይወራወራሉ፡ ቅድመ/ድህረ_ተግባር ሚና ተቆጣጣሪዎችን ሊጎትት ይችላል፣ እና ሚና ተቆጣጣሪዎችን ከጨዋታው ሊጎትት ይችላል። ነገር ግን፣ "ተሻጋሪ ሚና" ወደ ተቆጣጣሪዎች የሚደረጉ ጥሪዎች ተራ ተቆጣጣሪን ከመድገም የበለጠ wtf ያስከትላሉ። (ሌላው የምርጥ ልምዶች አካል የተቆጣጣሪ ስሞችን መድገም ነው)።

ዋናው ልዩነት ተግባሩ የሚፈጸመው (በደመቀ ሁኔታ) ሁልጊዜ (ፕላስ / የመቀነስ መለያዎች እና when), እና ተቆጣጣሪው - በስቴት ለውጥ (የተቀየረ ከሆነ ብቻ እንደሚሰራ ማሳወቅ). አደጋው ምንድን ነው? ለምሳሌ ፣ እንደገና ሲጀምሩ ፣ ካልተቀየረ ፣ ከዚያ ምንም ተቆጣጣሪ አይኖርም። እና የወላጅነት ተግባር ካልተቀየረ ተቆጣጣሪውን ማስፈፀም ለምን ያስፈልገናል? ለምሳሌ አንድ ነገር ስለተበላሸ እና ስለተለወጠ ነገር ግን ግድያው ተቆጣጣሪው ላይ አልደረሰም. ለምሳሌ አውታረ መረቡ ለጊዜው ስለጠፋ። አወቃቀሩ ተለውጧል፣ አገልግሎቱ እንደገና አልተጀመረም። በሚቀጥለው ጅምር, ውቅሩ ከአሁን በኋላ አይለወጥም, እና አገልግሎቱ ከአሮጌው የውቅረት ስሪት ጋር ይቆያል.

በማዋቀሩ ላይ ያለው ሁኔታ ሊፈታ የሚችል አይደለም (በይበልጥ በትክክል ለእራስዎ ልዩ ዳግም ማስጀመር ፕሮቶኮልን በፋይል ባንዲራዎች ወዘተ መፍጠር ይችላሉ ፣ ግን ይህ በማንኛውም መልኩ 'መሰረታዊ ሊቻል የሚችል' አይደለም)። ግን ሌላ የተለመደ ታሪክ አለ: አፕሊኬሽኑን ጫንን, ቀዳነው .service- ፋይል, እና አሁን እንፈልጋለን daemon_reload и state=started. እና ለዚያ የተፈጥሮ ቦታው ተቆጣጣሪው ይመስላል. ነገር ግን ተቆጣጣሪ ሳይሆን በተግባር ዝርዝሩ መጨረሻ ላይ ያለ ተግባር ካደረጋችሁት ሁልጊዜም በድፍረት ይፈጸማል። የመጫወቻ ደብተሩ በመሃል ላይ ቢሰበርም. ይህ እንደገና የጀመረውን ችግር በጭራሽ አይፈታውም (እንደገና ከተጀመረው ባህሪ ጋር አንድ ተግባር ማከናወን አይችሉም ፣ ምክንያቱም ድፍረቱ ጠፍቷል) ፣ ግን በእርግጠኝነት ሁኔታን ማድረጉ ጠቃሚ ነው ፣ የመጫወቻው አጠቃላይ መረጋጋት ይጨምራል ፣ ምክንያቱም። የግንኙነቶች ብዛት እና ተለዋዋጭ ሁኔታ ይቀንሳል.

ሌላው የተቆጣጣሪው አወንታዊ ባህሪ ውጤቱን የማይበክል መሆኑ ነው። ምንም ለውጦች አልነበሩም - ምንም ተጨማሪ የተዘለለ የለም ወይም በውጤቱ ውስጥ እሺ - ለማንበብ ቀላል። እሱ ደግሞ አሉታዊ ንብረት ነው - በመጀመሪያው ሩጫ ላይ በመስመር ላይ በተሰራ ተግባር ውስጥ የትየባ ምልክት ካገኙ ፣ ከዚያ ተቆጣጣሪዎች ሲቀየሩ ብቻ ይገደላሉ ፣ ማለትም። በተወሰኑ ሁኔታዎች - በጣም አልፎ አልፎ. ለምሳሌ በሕይወቴ ውስጥ ለመጀመሪያ ጊዜ ከአምስት ዓመት በኋላ. እና በእርግጥ, በስሙ ውስጥ የትየባ ይሆናል እና ሁሉም ነገር ይቋረጣል. እና ለሁለተኛ ጊዜ አይሮጡም - አልተለወጠም.

በተናጠል, ስለ ተለዋዋጮች መገኘት መነጋገር አስፈላጊ ነው. ለምሳሌ፣ ለአንድ ተግባር በ loop ካሳወቁ፣ በተለዋዋጮች ውስጥ ምን ይሆናሉ? በትንታኔ መገመት ትችላላችሁ፣ ነገር ግን ሁልጊዜም ቀላል አይደለም፣ በተለይ ተለዋዋጮች ከተለያዩ ቦታዎች የሚመጡ ከሆነ።

… ስለዚህ ተቆጣጣሪዎች ከሚመስሉት በላይ ጠቃሚ እና ብዙ ችግር ያለባቸው ናቸው። የሆነ ነገር ያለ ተቆጣጣሪዎች በሚያምር ሁኔታ መጻፍ ከቻሉ ያለእነሱ ቢያደርጉት ይሻላል። በሚያምር ሁኔታ ካልሰራ, ከእነሱ ጋር የተሻለ ነው.

አስተዋይ አንባቢ ያልተነጋገርነውን በትክክል አስተውሏል። listenአንድ ተቆጣጣሪ በሌላ ተቆጣጣሪ ላይ ማሳወቂያ መደወል እንደሚችል፣ አንድ ተቆጣጣሪ የማስመጣት_ተግባራትን ሊያካትት እንደሚችል (እነዚህም_role c with_itemsን ሊያካትት ይችላል)፣ የ Ansible's ተቆጣጣሪ ስርዓት ቱሪንግ-ሙሉ ነው፣ የሚና ተቆጣጣሪዎች ከጨዋታ ተቆጣጣሪዎች ጋር በሚገርም ሁኔታ የሚገናኙበት፣ ወዘተ. መ. - ይህ ሁሉ በግልጽ "መሰረታዊ" አይደለም).

ምንም እንኳን አንድ የተወሰነ WTF በእውነቱ ሊታወስ የሚገባው ባህሪ ቢኖርም። ተግባርዎ ከተፈፀመ delegate_to እና አሳውቋል, ከዚያም ተጓዳኝ ተቆጣጣሪው ያለሱ ይከናወናል delegate_to፣ ማለትም እ.ኤ.አ. ጨዋታ በተመደበበት አስተናጋጅ ላይ. (ምንም እንኳን ተቆጣጣሪው በእርግጥ ሊኖረው ይችላል delegate_to ተመሳሳይ)።

ለየብቻ፣ እንደገና ጥቅም ላይ ስለሚውሉ ሚናዎች ጥቂት ቃላት ማለት እፈልጋለሁ። ከስብስብ በፊት፣ የምትችሉትን ሁለንተናዊ ሚናዎች ማድረግ እንደምትችል ሀሳብ ነበር። ansible-galaxy install ሄደ። በሁሉም ሁኔታዎች በሁሉም ስሪቶች በሁሉም OS ላይ ይሰራል። እንግዲህ የኔ እይታ ይህ ነው፡ አይሰራም። ትልቅ ሚና ያለው ማንኛውም ሚና include_vars, 100500 ጉዳዮችን መደገፍ የማዕዘን ኬዝ ስህተቶች ገደል ነው. በትልቅ ሙከራ ሊሰኩ ይችላሉ፣ ነገር ግን እንደማንኛውም ሙከራ፣ የካርቴዥያ የግቤት እሴቶች እና አጠቃላይ ተግባር አለህ፣ ወይም "የተለያዩ ሁኔታዎች ተሸፍነዋል"። የእኔ አስተያየት ሚናው መስመራዊ (ሳይክሎማቲክ ውስብስብነት 1) ከሆነ በጣም የተሻለ ነው.

ጥቂቶቹ if'ov (ግልጽ ወይም ገላጭ - በቅጹ when ወይም ቅጽ include_vars በተለዋዋጮች ስብስብ ላይ), የተሻለ ሚና. አንዳንድ ጊዜ ቅርንጫፎችን መሥራት አለብዎት, ግን, እደግማለሁ, ያነሱ, የተሻሉ ናቸው. ስለዚህ ከጋላክሲው ጋር ጥሩ ሚና ያለው ይመስላል (ይሰራል!) በቡድን when ከአምስት ተግባራት "የራስ" ሚና ያነሰ ተመራጭ ሊሆን ይችላል. ከጋላክሲው ጋር ያለው ሚና የተሻለ በሚሆንበት ጊዜ አንድ ነገር መጻፍ ሲጀምሩ ነው። በጣም የሚባባስበት ጊዜ አንድ ነገር ሲሰበር ነው, እና "ከጋላክሲው ጋር ያለው ሚና" ምክንያት እንደሆነ ጥርጣሬ አለዎት. ከፍተውታል፣ እና አምስት መካተቶች፣ ስምንት የተግባር ዝርዝሮች እና ቁልል አሉ። when'ov ... እና ይሄ መስተካከል አለበት። ከ 5 ተግባራት ይልቅ, ምንም የሚሰበር ነገር የሌለበት, የመስመር ዝርዝር.

በሚከተሉት ክፍሎች

  • ሾለ ክምችት፣ የቡድን ተለዋዋጮች፣ አስተናጋጅ_group_vars ተሰኪ፣ አስተናጋጅነት ጥቂት። ከጎርዲያን ኖት ከስፓጌቲ እንዴት እንደሚታሰር። ወሰን እና ቅድመ-ተለዋዋጮች ፣ ሊቻል የሚችል የማህደረ ትውስታ ሞዴል። "ለመሆኑ የውሂብ ጎታውን የተጠቃሚ ስም የት ነው የሚያከማቹት?"
  • jinja: {{ jinja }} - nosql notype አፍንጫ ለስላሳ ፕላስቲን. እርስዎ በማይጠብቁት ቦታ እንኳን በሁሉም ቦታ ነው. ሾለ ትንሽ !!unsafe እና ጣፋጭ yaml.

ምንጭ: hab.com

አስተያየት ያክሉ