የሚቻለውን በመጠቀም የባቡር መተግበሪያን ለማሰማራት አገልጋይ ማዋቀር

ብዙም ሳይቆይ አገልጋዩን የባቡር መተግበሪያን ለማሰማራት ለማዘጋጀት ብዙ ሊቻሉ የሚችሉ የመጫወቻ መጽሃፎችን መጻፍ ነበረብኝ። እና በሚገርም ሁኔታ ቀላል ደረጃ በደረጃ መመሪያ አላገኘሁም። ምን እየተከሰተ እንዳለ ሳልረዳ የሌላ ሰው መጫወቻ መጽሐፍ መገልበጥ አልፈልግም ነበር, እና በመጨረሻም ሰነዶቹን ማንበብ ነበረብኝ, ሁሉንም ነገር እራሴ እየሰበሰብኩ ነው. ምናልባት በዚህ ጽሑፍ እገዛ አንድ ሰው ይህን ሂደት እንዲያፋጥኑ ልረዳው እችላለሁ.

በመጀመሪያ ሊረዱት የሚገባው ነገር በኤስኤስኤች በኩል በርቀት አገልጋይ(ዎች) ላይ አስቀድሞ የተገለጹ የእርምጃዎች ዝርዝር ለማከናወን ansible ምቹ የሆነ በይነገጽ ይሰጥዎታል። እዚህ ምንም አስማት የለም፣ ፕለጊን መጫን አይችሉም እና የመተግበሪያዎን የእረፍት ጊዜ ማሰማራት በዶክተር፣ ክትትል እና ሌሎች ከሳጥኑ ውጪ። የመጫወቻ መጽሐፍ ለመጻፍ በትክክል ምን ማድረግ እንደሚፈልጉ እና እንዴት እንደሚሠሩ ማወቅ አለብዎት። ለዛ ነው ከ GitHub በተዘጋጁ የመጫወቻ መጽሃፎች ወይም እንደ "ገልብጠው አሂድ፣ ይሰራል።" ያልረኩት።

ምን ያስፈልገናል?

አስቀድሜ እንደተናገርኩት የመጫወቻ መጽሐፍ ለመጻፍ ምን ማድረግ እንደሚፈልጉ እና እንዴት እንደሚያደርጉት ማወቅ አለብዎት. የሚያስፈልገንን እንወስን. ለ Rails መተግበሪያ በርካታ የስርዓት ፓኬጆችን እንፈልጋለን፡ nginx፣ postgresql (redis፣ ወዘተ)። በተጨማሪም, የተወሰነ የሩቢ ስሪት ያስፈልገናል. በ rbenv (rvm, asdf ...) በኩል መጫን የተሻለ ነው. ይህንን ሁሉ እንደ ስር ተጠቃሚ ማካሄድ ሁልጊዜ መጥፎ ሀሳብ ነው, ስለዚህ የተለየ ተጠቃሚ መፍጠር እና መብቶቹን ማዋቀር ያስፈልግዎታል. ከዚህ በኋላ, የእኛን ኮድ ወደ አገልጋዩ መስቀል, ለ nginx, postgres, ወዘተ ውቅሮችን መቅዳት እና እነዚህን ሁሉ አገልግሎቶች መጀመር ያስፈልግዎታል.

በውጤቱም, የእርምጃዎች ቅደም ተከተል እንደሚከተለው ነው.

  1. እንደ ስር ይግቡ
  2. የስርዓት ፓኬጆችን ይጫኑ
  3. አዲስ ተጠቃሚ ይፍጠሩ, መብቶችን ያዋቅሩ, ssh ቁልፍ
  4. የስርዓት ፓኬጆችን (nginx ወዘተ) ያዋቅሩ እና ያሂዱ
  5. በመረጃ ቋቱ ውስጥ ተጠቃሚ እንፈጥራለን (ወዲያውኑ የውሂብ ጎታ መፍጠር ይችላሉ)
  6. እንደ አዲስ ተጠቃሚ ይግቡ
  7. rbenv እና ruby ​​ጫን
  8. ማቀፊያውን በመጫን ላይ
  9. የመተግበሪያ ኮድ በመስቀል ላይ
  10. የፑማ አገልጋይን በማስጀመር ላይ

በተጨማሪም የመጨረሻዎቹ ደረጃዎች ካፒስታኖን በመጠቀም ሊከናወኑ ይችላሉ, ቢያንስ ከሳጥኑ ውስጥ ኮድን ወደ መልቀቂያ ማውጫዎች መገልበጥ, በተሳካ ሁኔታ ማሰማራት ላይ ልቀቱን በሲምሊንክ መቀየር, ውቅሮችን ከተጋራ ማውጫ መቅዳት, puma እንደገና ማስጀመር, ወዘተ. ይህ ሁሉ በ Asible በመጠቀም ሊከናወን ይችላል, ግን ለምን?

የፋይል መዋቅር

Asible ጥብቅ አለው የፋይል መዋቅር ለሁሉም ፋይሎችዎ, ስለዚህ ሁሉንም በተለየ ማውጫ ውስጥ ማስቀመጥ የተሻለ ነው. በተጨማሪም ፣ በባቡር ሀዲዱ ውስጥ በራሱ ወይም በተናጥል መሆን አለመሆኑ በጣም አስፈላጊ አይደለም ። ፋይሎችን በተለየ የጂት ማከማቻ ውስጥ ማከማቸት ይችላሉ። በግሌ በባቡር ሀዲድ አፕሊኬሽኑ / config directory ውስጥ ሊቻል የሚችል ማውጫ መፍጠር እና ሁሉንም ነገር በአንድ ማከማቻ ውስጥ ማከማቸት በጣም ምቹ ሆኖ አግኝቼዋለሁ።

ቀላል የመጫወቻ መጽሐፍ

ፕሌይቡክ ልዩ አገባብ በመጠቀም ምን ማድረግ እንዳለበት እና እንዴት ማድረግ እንዳለበት የሚገልጽ የyml ፋይል ነው። ምንም የማያደርግ የመጀመሪያውን የመጫወቻ መጽሐፍ እንፍጠር፡-

---
- name: Simple playbook
  hosts: all

እዚህ በቀላሉ የእኛ ጨዋታ መጽሃፍ ተጠርቷል እንላለን Simple Playbook እና ይዘቱ ለሁሉም አስተናጋጆች መከናወን አለበት. ከስሙ ጋር / ሊቻል በሚችል ማውጫ ውስጥ ልናስቀምጠው እንችላለን playbook.yml እና ለመሮጥ ይሞክሩ:

ansible-playbook ./playbook.yml

PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched

ከሁሉም ዝርዝር ጋር የሚዛመዱ አስተናጋጆችን እንደማላውቅ ተናግሯል። በልዩ ውስጥ መዘርዘር አለባቸው የእቃ ዝርዝር ፋይል.

በተመሳሳይ ማውጫ ውስጥ እንፍጠር

123.123.123.123

አስተናጋጁን በቀላሉ የምንገልፀው በዚህ መንገድ ነው (የእኛን የቪፒኤስ አስተናጋጅ ለሙከራ፣ ወይም localhost መመዝገብ ትችላላችሁ) እና በስሙ ስር እናስቀምጠዋለን። inventory.
በክምችት ፋይል ለማሄድ መሞከር ትችላለህ፡-

ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************

PLAY RECAP ************************************************************************************************************************************

ወደተገለጸው አስተናጋጅ የssh መዳረሻ ካሎት፣ ከዚያም ansible ይገናኛል እና የርቀት ስርዓቱን መረጃ ይሰበስባል። (ነባሪ TASK [የመሰብሰብ እውነታዎች]) ከዚያ በኋላ ስለ አፈፃፀሙ አጭር ዘገባ ይሰጣል (PLAY RECAP)።

በነባሪ, ግንኙነቱ ወደ ስርዓቱ የገቡበትን የተጠቃሚ ስም ይጠቀማል. ምናልባት በአስተናጋጁ ላይ ላይሆን ይችላል። በመጫወቻ ደብተር ፋይል ውስጥ የርቀት_ተጠቃሚ መመሪያን ተጠቅመው የትኛውን ተጠቃሚ እንደሚገናኙ መግለጽ ይችላሉ። እንዲሁም ስለ የርቀት ስርዓት መረጃ ብዙ ጊዜ ለእርስዎ አላስፈላጊ ላይሆን ይችላል እና እሱን ለመሰብሰብ ጊዜ ማባከን የለብዎትም። ይህ ተግባር እንዲሁ ሊሰናከል ይችላል፡-

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

የጨዋታ መጽሃፉን እንደገና ለማስኬድ ይሞክሩ እና ግንኙነቱ እየሰራ መሆኑን ያረጋግጡ። (የስር ተጠቃሚውን ከገለጹ፣ ከፍ ያሉ መብቶችን ለማግኘት ትክክለኛውን መመሪያ መግለጽ ያስፈልግዎታል። በሰነዱ ላይ እንደተፃፈው፡- become set to ‘true’/’yes’ to activate privilege escalation. ለምን እንደሆነ ሙሉ በሙሉ ግልጽ ባይሆንም).

ምናልባት የ Python አስተርጓሚውን ሊወስን ባለመቻሉ የተከሰተ ስህተት ይደርስዎታል ፣ ከዚያ እርስዎ እራስዎ ሊገልጹት ይችላሉ-

ansible_python_interpreter: /usr/bin/python3 

በትእዛዙ ፓይቶን የት እንዳለህ ማወቅ ትችላለህ whereis python.

የስርዓት ፓኬጆችን መጫን

የ Ansible መደበኛ ስርጭት ከተለያዩ የስርዓት ፓኬጆች ጋር ለመስራት ብዙ ሞጁሎችን ያካትታል ፣ ስለሆነም በማንኛውም ምክንያት የባሽ ስክሪፕቶችን መፃፍ የለብንም ። አሁን ስርዓቱን ለማዘመን እና የስርዓት ፓኬጆችን ለመጫን ከእነዚህ ሞጁሎች ውስጥ አንዱን እንፈልጋለን። በእኔ VPS ላይ ኡቡንቱ ሊኑክስ አለኝ፣ ስለዚህ እጠቀማለሁ ጥቅሎችን ለመጫን apt-get и ሞጁል ለእሱ. የተለየ ኦፕሬቲንግ ሲስተም እየተጠቀሙ ከሆነ የተለየ ሞጁል ሊፈልጉ ይችላሉ (አስታውስ እኔ መጀመሪያ ላይ ምን እና እንዴት እንደምናደርግ አስቀድመን ማወቅ እንዳለብን ተናግሬ ነበር)። ይሁን እንጂ አገባብ በጣም አይቀርም ተመሳሳይ ይሆናል.

የመጫወቻ መጽሐፋችንን በመጀመሪያዎቹ ተግባራት እንጨምር፡-

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

ተግባር በትክክል በሩቅ አገልጋዮች ላይ ሊሰራ የሚችል ተግባር ነው። ስራውን በምዝግብ ማስታወሻው ውስጥ አፈፃፀሙን ለመከታተል እንድንችል ስም እንሰጠዋለን. እና ምን ማድረግ እንዳለበት የአንድ የተወሰነ ሞጁል አገባብ በመጠቀም እንገልፃለን። በዚህ ጉዳይ ላይ apt: update_cache=yes - አፕት ሞጁሉን በመጠቀም የስርዓት ፓኬጆችን ማዘመን ይላል። ሁለተኛው ትእዛዝ ትንሽ የተወሳሰበ ነው። የፓኬጆችን ዝርዝር ለተገቢው ሞጁል እናስተላልፋለን እና እነሱ ናቸው እንላለን state መሆን አለበት። presentማለትም እነዚህን ጥቅሎች ይጫኑ እንላለን። በተመሳሳይ መልኩ፣ እንዲሰርዟቸው ወይም በቀላሉ በመቀየር እንዲያዘምኗቸው ልንነግራቸው እንችላለን state. እባክዎ ልብ ይበሉ ለሀዲድ ከድህረ-ግሬስክል ጋር ለመስራት አሁን የምንጭነው የፖስትግሬስql-contrib ጥቅል ያስፈልገናል። እንደገና፣ ይህን ማወቅ እና ማድረግ አለብህ፤ በራሱ አቅም ይህን አያደርግም።

የጨዋታ መጽሃፉን እንደገና ለማስኬድ ይሞክሩ እና ጥቅሎቹ መጫኑን ያረጋግጡ።

አዳዲስ ተጠቃሚዎችን መፍጠር.

ከተጠቃሚዎች ጋር ለመስራት፣ Ansible እንዲሁ ሞጁል አለው - ተጠቃሚ። አንድ ተጨማሪ ተግባር እንጨምር (በየጊዜው ሙሉ በሙሉ ላለመቅዳት ቀድሞውንም የታወቁትን የመጫወቻ ደብተሩን ክፍሎች ከአስተያየቶቹ ጀርባ ደበቅኳቸው)

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: my_user
        shell: /bin/bash
        password: "{{ 123qweasd | password_hash('sha512') }}"

አዲስ ተጠቃሚ እንፈጥራለን፣ ሼል እና የይለፍ ቃል አዘጋጅለት። እና ከዚያ ወደ ብዙ ችግሮች እንገባለን። ለተለያዩ አስተናጋጆች የተጠቃሚ ስሞች የተለየ መሆን ካለባቸውስ? እና የይለፍ ቃሉን በጨዋታ ደብተር ውስጥ ግልጽ በሆነ ጽሑፍ ውስጥ ማከማቸት በጣም መጥፎ ሀሳብ ነው። ለመጀመር የተጠቃሚ ስም እና የይለፍ ቃል ወደ ተለዋዋጮች እናስቀምጠው እና ወደ መጣጥፉ መጨረሻ ላይ የይለፍ ቃሉን እንዴት ማመስጠር እንዳለብኝ አሳያለሁ።

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"

ድርብ ጥምዝ ቅንፎችን በመጠቀም ተለዋዋጮች በመጫወቻ ደብተር ውስጥ ተቀምጠዋል።

በክምችት መዝገብ ውስጥ የተለዋዋጮችን እሴቶች እንጠቁማለን-

123.123.123.123

[all:vars]
user=my_user
user_password=123qweasd

እባክዎ መመሪያውን ያስተውሉ [all:vars] - የሚቀጥለው የጽሑፍ እገዳ ተለዋዋጮች (vars) ናቸው እና ለሁሉም አስተናጋጆች (ሁሉም) ተፈጻሚ እንደሆኑ ይናገራል።

ንድፉም ትኩረት የሚስብ ነው። "{{ user_password | password_hash('sha512') }}". ነገሩ ansible ተጠቃሚው በኩል መጫን አይደለም ነው user_add በእጅ እንደሚያደርጉት. እና ሁሉንም መረጃዎች በቀጥታ ያስቀምጣቸዋል, ለዚያም ነው የይለፍ ቃሉን ወደ ሃሽ አስቀድመን መለወጥ ያለብን, ይህ ትዕዛዝ የሚያደርገው ነው.

ተጠቃሚችንን ወደ ሱዶ ቡድን እንጨምር። ሆኖም፣ ከዚህ በፊት ማንም ይህን አያደርግልንምና እንደዚህ አይነት ቡድን መኖሩን ማረጋገጥ አለብን፡-

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
        name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"

ሁሉም ነገር በጣም ቀላል ነው፣ ቡድኖችን ለመፍጠር የቡድን ሞጁል አለን፣ አገባብ ከአፕት ጋር በጣም ተመሳሳይ ነው። ከዚያ ይህንን ቡድን ለተጠቃሚው መመዝገብ በቂ ነው (groups: "sudo").
ያለይለፍ ቃል ተጠቅመን መግባት እንድንችል የssh ቁልፍን ወደዚህ ተጠቃሚ ማከል ጠቃሚ ነው።

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
      name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"
    - name: Deploy SSH Key
      authorized_key:
        user: "{{ user }}"
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
        state: present

በዚህ ጉዳይ ላይ ዲዛይኑ ትኩረት የሚስብ ነው "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" - የ id_rsa.pub ፋይልን ይዘቶች ይገልብጣል (ስምዎ የተለየ ሊሆን ይችላል) ማለትም የssh ቁልፍ ይፋዊ ክፍል እና በአገልጋዩ ላይ ለተጠቃሚው የተፈቀዱ ቁልፎች ዝርዝር ውስጥ ይሰቀለዋል።

ሚና

ሦስቱም አጠቃቀምን የመፍጠር ተግባራት በቀላሉ በአንድ ቡድን ውስጥ ሊከፋፈሉ ይችላሉ, እና ይህን ቡድን ከመጠን በላይ እንዳያድግ ከዋናው የመጫወቻ ደብተር በተናጠል ቢያስቀምጥ ጥሩ ይሆናል. ለዚህ ዓላማ, Ansible አለው ሚናዎች.
ገና መጀመሪያ ላይ በተጠቀሰው የፋይል መዋቅር መሰረት ሚናዎች በተለየ ሚናዎች ማውጫ ውስጥ መቀመጥ አለባቸው ፣ ለእያንዳንዱ ሚና ተመሳሳይ ስም ያለው የተለየ ማውጫ አለ ፣ በተግባሮች ፣ ፋይሎች ፣ አብነቶች ፣ ወዘተ ማውጫ ውስጥ።
የፋይል መዋቅር እንፍጠር፡- ./ansible/roles/user/tasks/main.yml (ዋናው አንድ ሚና ከመጫወቻው ጋር ሲገናኝ የሚጫነው እና የሚተገበረው ዋና ፋይል ነው፤ ሌሎች ሚና ፋይሎች ከእሱ ጋር ሊገናኙ ይችላሉ።) አሁን ከተጠቃሚው ጋር የተያያዙ ሁሉንም ተግባራት ወደዚህ ፋይል ማስተላለፍ ይችላሉ፡

# Create user and add him to groups
- name: Ensure a 'sudo' group
  group:
    name: sudo
    state: present

- name: Add a new user
  user:
    name: "{{ user }}"
    shell: /bin/bash
    password: "{{ user_password | password_hash('sha512') }}"
    groups: "sudo"

- name: Deploy SSH Key
  authorized_key:
    user: "{{ user }}"
    key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    state: present

በዋናው የመጫወቻ መጽሐፍ ውስጥ የተጠቃሚውን ሚና ለመጠቀም መግለጽ አለብዎት፡

---
- name: Simple playbook
  hosts: all
  remote_user: root
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

  roles:
    - user

እንዲሁም ስርዓቱን ከሌሎች ተግባራት ሁሉ በፊት ማዘመን ምክንያታዊ ሊሆን ይችላል ፣ ይህንን ለማድረግ እገዳውን እንደገና መሰየም ይችላሉ። tasks ውስጥ የተገለጹበት pre_tasks.

nginx በማዋቀር ላይ

አስቀድመን Nginx ን መጫን አለብን፤ እሱን ማዋቀር እና ማስኬድ አለብን። በ ሚና ውስጥ ወዲያውኑ እናድርገው. የፋይል መዋቅር እንፍጠር፡-

- ansible
  - roles
    - nginx
      - files
      - tasks
        - main.yml
      - templates

አሁን ፋይሎችን እና አብነቶችን እንፈልጋለን. በመካከላቸው ያለው ልዩነት ፋይሎቹን በቀጥታ መቅዳት ይቻላል ፣ ልክ እንደዚሁ። እና አብነቶች የ j2 ቅጥያ ሊኖራቸው ይገባል እና ተመሳሳይ ባለ ሁለት ጥምዝ ቅንፎችን በመጠቀም ተለዋዋጭ እሴቶችን መጠቀም ይችላሉ።

nginx ን እናንቃት main.yml ፋይል. ለዚህ እኛ የስርዓት ሞጁል አለን-

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

እዚህ ላይ nginx መጀመር አለበት ማለት ብቻ ሳይሆን (ይህም እንጀምራለን) ብቻ ሳይሆን ወዲያውኑ መንቃት አለበት እንላለን።
አሁን የማዋቀሪያ ፋይሎችን እንገልብጥ፡-

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'

ዋናውን የ nginx ውቅር ፋይል እንፈጥራለን (በቀጥታ ከአገልጋዩ ሊወስዱት ይችላሉ, ወይም እራስዎ ይፃፉ). እና እንዲሁም ለመተግበሪያችን የውቅረት ፋይል በጣቢያዎች_የሚገኝ ማውጫ ውስጥ (ይህ አስፈላጊ አይደለም ነገር ግን ጠቃሚ ነው)። በመጀመሪያው ጉዳይ ላይ ፋይሎችን ለመቅዳት የቅጂ ሞጁሉን እንጠቀማለን (ፋይሉ ውስጥ መሆን አለበት /ansible/roles/nginx/files/nginx.conf). በሁለተኛው ውስጥ, የተለዋዋጮችን እሴቶች በመተካት አብነቱን እንገለበጣለን. አብነት ውስጥ መሆን አለበት። /ansible/roles/nginx/templates/my_app.j2). እና እንደዚህ ያለ ነገር ሊመስል ይችላል-

upstream {{ app_name }} {
  server unix:{{ app_path }}/shared/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name {{ server_name }} {{ inventory_hostname }};
  root {{ app_path }}/current/public;

  try_files $uri/index.html $uri.html $uri @{{ app_name }};
  ....
}

ወደ ማስገቢያዎች ትኩረት ይስጡ {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} - እነዚህ እሴቶቻቸው ከመቅዳት በፊት በአብነት ውስጥ የሚተኩ ሁሉም ተለዋዋጮች ናቸው። ለተለያዩ የአስተናጋጆች ቡድኖች የመጫወቻ መጽሐፍ ከተጠቀሙ ይህ ጠቃሚ ነው። ለምሳሌ፣ የእቃ ዝርዝር ፋይላችንን ማከል እንችላለን፡-

[production]
123.123.123.123

[staging]
231.231.231.231

[all:vars]
user=my_user
user_password=123qweasd

[production:vars]
server_name=production
app_path=/home/www/my_app
app_name=my_app

[staging:vars]
server_name=staging
app_path=/home/www/my_stage
app_name=my_stage_app

አሁን የጨዋታ መጽሐፋችንን ከጀመርን ለሁለቱም አስተናጋጆች የተገለጹትን ተግባራት ያከናውናል። ግን በተመሳሳይ ጊዜ ለዝግጅት አስተናጋጅ ፣ ተለዋዋጮቹ ከአምራችዎቹ ይለያያሉ ፣ እና በ ሚናዎች እና የመጫወቻ መጽሐፍት ውስጥ ብቻ ሳይሆን በ nginx ውቅሮች ውስጥ። {{ inventory_hostname }} በእቃ ዝርዝር ውስጥ መገለጽ አያስፈልግም - ይህ ልዩ ተለዋዋጭ ተለዋዋጭ እና የመጫወቻ ደብተሩ አሁን እየሰራበት ያለው አስተናጋጅ እዚያ ተከማችቷል።
ለብዙ አስተናጋጆች የእቃ ዝርዝር ፋይል እንዲኖርዎት ከፈለጉ ፣ ግን ለአንድ ቡድን ብቻ ​​ያሂዱ ፣ ይህ በሚከተለው ትእዛዝ ሊከናወን ይችላል ።

ansible-playbook -i inventory ./playbook.yml -l "staging"

ሌላው አማራጭ ለተለያዩ ቡድኖች የተለየ የእቃ ዝርዝር ፋይሎች መኖሩ ነው. ወይም ብዙ የተለያዩ አስተናጋጆች ካሉዎት ሁለቱን አቀራረቦች ማዋሃድ ይችላሉ።

nginxን ወደ ማዋቀር እንመለስ። የውቅረት ፋይሎቹን ከገለበጥን በኋላ በsitest_enabled ወደ my_app.conf ከጣቢያዎች_የሚገኝ ሲምሊንክ መፍጠር አለብን። እና nginx እንደገና ያስጀምሩ.

... # old code in mail.yml

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted

ሁሉም ነገር እዚህ ቀላል ነው - እንደገና ሊቻል የሚችል ሞጁሎች ከመደበኛ አገባብ ጋር። ግን አንድ ነጥብ አለ. በእያንዳንዱ ጊዜ nginx ን እንደገና ማስጀመር ምንም ፋይዳ የለውም። እኛ እንደዚህ ያሉ ትዕዛዞችን እንደማንጽፍ አስተውለናል፡ “እንዲህ አድርግ”፣ አገባቡ የበለጠ “ይህ ሁኔታ ሊኖረው ይገባል” የሚል ይመስላል። እና ብዙውን ጊዜ ይህ በትክክል እንዴት እንደሚሰራ ነው። ቡድኑ ቀድሞውኑ ካለ ፣ ወይም የስርዓት ፓኬጁ ቀድሞውኑ ከተጫነ ፣ ከዚያ ansible ይህንን ያጣራል እና ተግባሩን ያቋርጣል። እንዲሁም ፋይሎች በአገልጋዩ ላይ ካለው ጋር ሙሉ በሙሉ የሚዛመዱ ከሆኑ አይገለበጡም። ይህንን መጠቀም እና nginx ን እንደገና ማስጀመር የምንችለው የማዋቀሪያ ፋይሎቹ ከተቀየሩ ብቻ ነው። ለዚህ የመመዝገቢያ መመሪያ አለ፡-

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes
  register: restart_nginx

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'
  register: restart_nginx

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted
  when: restart_nginx.changed

ከማዋቀሪያው ፋይሎች ውስጥ አንዱ ከተቀየረ, ቅጂው ይሠራል እና ተለዋዋጭው ይመዘገባል restart_nginx. እና ይህ ተለዋዋጭ ከተመዘገበ ብቻ አገልግሎቱ እንደገና ይጀምራል.

እና በእርግጥ, የ nginx ሚናን ወደ ዋናው የጨዋታ መጽሐፍ ማከል ያስፈልግዎታል.

postgresql በማዘጋጀት ላይ

postgresqlን በ nginx እንዳደረግነው ሲስተምድ በመጠቀም ማንቃት አለብን፣ እንዲሁም ዳታቤዙን እና ዳታቤዙን ራሱ ለማግኘት የምንጠቀምበትን ተጠቃሚ መፍጠር አለብን።
ሚና እንፍጠር /ansible/roles/postgresql/tasks/main.yml:

# Create user in postgresql
- name: enable postgresql and start
  systemd:
    name: postgresql
    state: started
    enabled: yes

- name: Create database user
  become_user: postgres
  postgresql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    role_attr_flags: SUPERUSER

- name: Create database
  become_user: postgres
  postgresql_db:
    name: "{{ db_name }}"
    encoding: UTF-8
    owner: "{{ db_user }}"

ተለዋዋጮችን ወደ ክምችት እንዴት እንደምጨምር አልገልጽም፣ ይህ አስቀድሞ ብዙ ጊዜ ተከናውኗል፣ እንዲሁም የpostgresql_db እና postgresql_user ሞጁሎች አገባብ። ተጨማሪ መረጃ በሰነዱ ውስጥ ሊገኝ ይችላል. በጣም የሚያስደስት መመሪያ እዚህ አለ become_user: postgres. እውነታው ግን በነባሪ የፖስትግሬስ ተጠቃሚ ብቻ ወደ postgresql ዳታቤዝ እና በአካባቢው ብቻ ነው የሚደርሰው። ይህ መመሪያ ይህንን ተጠቃሚ ወክለው ትዕዛዞችን እንድንፈጽም ይፈቅድልናል (በእርግጥ መዳረሻ ካለን)።
እንዲሁም አዲስ ተጠቃሚ የውሂብ ጎታውን እንዲደርስ ለመፍቀድ መስመር ወደ pg_hba.conf ማከል ሊኖርብዎ ይችላል። ይህ የ nginx ውቅረትን እንደቀየርን በተመሳሳይ መንገድ ሊከናወን ይችላል።

እና በእርግጥ ፣ የድህረ-ግግር ሚናን ወደ ዋናው የጨዋታ መጽሐፍ ማከል ያስፈልግዎታል።

በ rbenv በኩል ሩቢን በመጫን ላይ

Ansible rbenv ጋር ለመስራት ሞጁሎች የሉትም, ነገር ግን አንድ git ማከማቻ ክሎኒንግ በማድረግ ተጭኗል. ስለዚህ, ይህ ችግር በጣም መደበኛ ያልሆነ ይሆናል. ሚና እንፍጠርላት /ansible/roles/ruby_rbenv/main.yml እና መሙላት እንጀምር፡-

# Install rbenv and ruby
- name: Install rbenv
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv

ለእነዚህ አላማዎች በፈጠርነው ተጠቃሚ ስር ለመስራት የbe_user መመሪያን እንደገና እንጠቀማለን። Rbenv በቤቱ ማውጫ ውስጥ ስለተጫነ እና በዓለም አቀፍ ደረጃ አይደለም። እና repo እና destን በመግለጽ ማከማቻውን ለመዝጋት የgit ሞጁሉን እንጠቀማለን።

በመቀጠል rbenv init በ bashrc ውስጥ መመዝገብ እና rbenv ወደ PATH ማከል አለብን። ለዚህም የ lineinfile ሞጁል አለን-

- name: Add rbenv to PATH
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'export PATH="${HOME}/.rbenv/bin:${PATH}"'

- name: Add rbenv init to bashrc
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'eval "$(rbenv init -)"'

ከዚያ ruby_build ን መጫን ያስፈልግዎታል:

- name: Install ruby-build
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build

እና በመጨረሻም ሩቢን ይጫኑ. ይህ የሚከናወነው በ rbenv በኩል ነው ፣ ማለትም ፣ በቀላሉ በ bash ትዕዛዝ።

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    rbenv install {{ ruby_version }}
  args:
    executable: /bin/bash

የትኛውን ትዕዛዝ እና በምን እንደሚፈፀም እንናገራለን. ሆኖም፣ እዚህ ጋር አጋጥሞናል ansible ትእዛዞቹን ከማስኬዱ በፊት በ bashrc ውስጥ ያለውን ኮድ አይሰራም። ይህ ማለት rbenv በተመሳሳይ ስክሪፕት ውስጥ በቀጥታ መገለጽ አለበት ማለት ነው።

የሚቀጥለው ችግር የሼል ትዕዛዝ ከአቅም አንፃር ምንም አይነት ሁኔታ ስለሌለው ነው. ማለትም ይህ የሩቢ ስሪት መጫኑን አለመጫኑን በራስ ሰር ማረጋገጥ አይቻልም። እኛ እራሳችንን ማድረግ እንችላለን-

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    if ! rbenv versions | grep -q {{ ruby_version }}
      then rbenv install {{ ruby_version }} && rbenv global {{ ruby_version }}
    fi
  args:
    executable: /bin/bash

የሚቀረው ጥቅል መጫን ብቻ ነው፡-

- name: Install bundler
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    gem install bundler

እና እንደገና የኛን ሚና ruby_rbenv ወደ ዋናው የመጫወቻ መጽሐፍ ጨምር።

የተጋሩ ፋይሎች።

በአጠቃላይ ማዋቀሩ እዚህ ሊጠናቀቅ ይችላል። በመቀጠል, የቀረው ካፒስትራኖን ማስኬድ ብቻ ነው እና ኮዱን በራሱ ይገለበጣል, አስፈላጊዎቹን ማውጫዎች ይፍጠሩ እና አፕሊኬሽኑን ያስጀምሩ (ሁሉም ነገር በትክክል ከተዋቀረ). ይሁን እንጂ ካፒስታኖ ብዙ ጊዜ ተጨማሪ የማዋቀሪያ ፋይሎችን ይፈልጋል, ለምሳሌ database.yml ወይም .env ልክ እንደ ፋይሎች እና አብነቶች ለ nginx ሊገለበጡ ይችላሉ። አንድ ረቂቅ ነገር ብቻ ነው። ፋይሎችን ከመቅዳትዎ በፊት ለእነሱ የማውጫ መዋቅር መፍጠር ያስፈልግዎታል ፣ እንደዚህ ያለ ነገር

# Copy shared files for deploy
- name: Ensure shared dir
  become_user: "{{ user }}"
  file:
    path: "{{ app_path }}/shared/config"
    state: directory

እኛ አንድ ማውጫ ብቻ እንገልፃለን እና አስፈላጊ ከሆነ አስፈላጊ ከሆነ ወላጆችን ይፈጥራል።

ሊቻል የሚችል ቮልት

ተለዋዋጮች እንደ የተጠቃሚው ይለፍ ቃል ያሉ ሚስጥራዊ መረጃዎችን ሊይዙ እንደሚችሉ አስቀድመን አግኝተናል። ከፈጠርክ .env ለመተግበሪያው ፋይል, እና database.yml ከዚያ የበለጠ እንደዚህ ያለ ወሳኝ ውሂብ መኖር አለበት። ከሚታዩ ዓይኖች መደበቅ ጥሩ ይሆናል. ለዚሁ ዓላማ ጥቅም ላይ ይውላል ሊቻል የሚችል ቮልት.

ለተለዋዋጮች ፋይል እንፍጠር /ansible/vars/all.yml (እዚህ ለተለያዩ የአስተናጋጆች ቡድኖች የተለያዩ ፋይሎችን መፍጠር ይችላሉ፣ ልክ እንደ ክምችት ፋይሉ፡ production.yml፣ staging.yml፣ ወዘተ)።
መመስጠር ያለባቸው ሁሉም ተለዋዋጮች መደበኛ የyml አገባብ በመጠቀም ወደዚህ ፋይል መተላለፍ አለባቸው፡

# System vars
user_password: 123qweasd
db_password: 123qweasd

# ENV vars
aws_access_key_id: xxxxx
aws_secret_access_key: xxxxxx
aws_bucket: bucket_name
rails_secret_key_base: very_secret_key_base

ከዚያ በኋላ ይህ ፋይል በሚከተለው ትዕዛዝ መመስጠር ይቻላል፡-

ansible-vault encrypt ./vars/all.yml

በተፈጥሮ፣ በማመስጠር ጊዜ፣ ለመበተን የይለፍ ቃል ማዘጋጀት ያስፈልግዎታል። ይህንን ትዕዛዝ ከደወሉ በኋላ በፋይሉ ውስጥ ምን እንደሚሆን ማየት ይችላሉ.

በ እገዛ ansible-vault decrypt ፋይሉ ዲክሪፕት ሊደረግ ፣ ሊሻሻል እና ከዚያ እንደገና መመስጠር ይችላል።

ለመስራት ፋይሉን ዲክሪፕት ማድረግ አያስፈልግም። ኢንክሪፕትድ ሆኖ ያከማቻል እና የመጫወቻ ደብተሩን ከክርክሩ ጋር ያካሂዱት --ask-vault-pass. አሲቭል የይለፍ ቃሉን ይጠይቃል፣ ተለዋዋጮችን ሰርስሮ እና ተግባራቶቹን ይፈጽማል። ሁሉም መረጃዎች እንደተመሰጠሩ ይቆያሉ።

የበርካታ የአስተናጋጆች ቡድን እና ሊቻል የሚችል ቮልት የተሟላ ትዕዛዝ እንደዚህ ያለ ነገር ይመስላል።

ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass

ግን የመጫወቻ መጽሐፍትን እና ሚናዎችን ሙሉ ጽሑፍ አልሰጥዎትም ፣ እራስዎ ይፃፉ። ምክንያቱም ሊቻል የሚችል እንደዚህ ነው - ምን መደረግ እንዳለበት ካልተረዱ, ከዚያ ለእርስዎ አያደርግም.

ምንጭ: hab.com

አስተያየት ያክሉ