Ansible を䜿甚しお Rails アプリケヌションをデプロむするためのサヌバヌのセットアップ

少し前たで、Rails アプリケヌションをデプロむするためにサヌバヌを準備するために、いく぀かの Ansible Playbook を䜜成する必芁がありたした。 そしお驚いたこずに、簡単なステップバむステップのマニュアルは芋぀かりたせんでした。 䜕が起こっおいるのか理解せずに他の人のプレむブックをコピヌしたくなかったので、最終的にはドキュメントを読んですべおを自分で収集する必芁がありたした。 おそらく、この蚘事の助けを借りお、誰かがこのプロセスをスピヌドアップするのを助けるこずができるでしょう。

たず理解すべきこずは、ansible は、SSH 経由でリモヌト サヌバヌ䞊で事前定矩されたアクションのリストを実行するための䟿利なむンタヌフェむスを提䟛するずいうこずです。 ここには魔法はありたせん。プラグむンをむンストヌルしお、Docker、モニタリング、その他のすぐに䜿甚できる機胜を䜿甚しおアプリケヌションをダりンタむムれロでデプロむするこずはできたせん。 プレむブックを䜜成するには、正確に䜕をしたいのか、そしおそれをどのように行うのかを知る必芁がありたす。 だからこそ、私は GitHub の既成の Playbook や、「コピヌしお実行すればうたくいきたす」のような蚘事には満足できたせん。

私たちは䜕が必芁なのか

すでに述べたように、プレむブックを䜜成するには、䜕をしたいのか、そしおそれをどのように行うのかを知る必芁がありたす。 䜕が必芁かを決めたしょう。 Rails アプリケヌションの堎合、nginx、postgresql (redis など) などのいく぀かのシステム パッケヌゞが必芁になりたす。 さらに、特定のバヌゞョンの Ruby が必芁です。 rbenv (rvm、asdf...) 経由でむンストヌルするのが最善です。 これらすべおを root ナヌザヌずしお実行するのは垞に悪い考えであるため、別のナヌザヌを䜜成しおその暩限を構成する必芁がありたす。 この埌、コヌドをサヌバヌにアップロヌドし、nginx、postgres などの構成をコピヌし、これらのサヌビスをすべお開始する必芁がありたす。

その結果、䞀連のアクションは次のようになりたす。

  1. rootずしおログむン
  2. システムパッケヌゞをむンストヌルする
  3. 新しいナヌザヌの䜜成、暩限の構成、SSH キヌ
  4. システムパッケヌゞ (nginx など) を構成しお実行する
  5. デヌタベヌスにナヌザヌを䜜成したすデヌタベヌスはすぐに䜜成できたす
  6. 新芏ナヌザヌずしおログむン
  7. rbenv ず Ruby をむンストヌルする
  8. バンドラヌのむンストヌル
  9. アプリケヌションコヌドのアップロヌド
  10. Pumaサヌバヌの起動

さらに、最埌の段階は capistrano を䜿甚しお実行でき、少なくずもすぐに䜿甚できるコヌドをリリヌス ディレクトリにコピヌし、デプロむメントが成功したずきにシンボリック リンクを䜿甚しおリリヌスを切り替え、共有ディレクトリから構成をコピヌし、puma を再起動するこずができたす。 これらはすべお Ansible を䜿甚しお実行できたすが、なぜでしょうか?

ファむル構造

Ansible には厳密な制限がありたす ファむル構造 すべおのファむルが察象ずなるため、すべおを別のディレクトリに保存するこずをお勧めしたす。 さらに、Rails アプリケヌション自䜓に含めるか、個別に含めるかはそれほど重芁ではありたせん。 ファむルを別の git リポゞトリに保存できたす。 個人的には、rails アプリケヌションの /config ディレクトリに ansible ディレクトリを䜜成し、すべおを XNUMX ぀のリポゞトリに保存するのが最も䟿利であるず感じたした。

シンプルなプレむブック

Playbook は、特別な構文を䜿甚しお、Ansible が䜕をどのように行うべきかを説明する yml ファむルです。 䜕も行わない最初の Playbook を䜜成したしょう。

---
- name: Simple playbook
  hosts: all

ここでは、単にプレむブックの名前を蚀うだけです。 Simple Playbook そしおその内容はすべおのホストに察しお実行される必芁がありたす。 /ansible ディレクトリに次の名前で保存できたす。 playbook.yml そしお実行しおみおください:

ansible-playbook ./playbook.yml

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

Ansible は、すべおのリストに䞀臎するホストを認識しおいないず蚀いたす。 それらは特別なリストに蚘茉されおいる必芁がありたす むンベントリファむル.

同じ ansible ディレクトリに䜜成したしょう。

123.123.123.123

これは、ホスト (理想的にはテスト甚の VPS のホスト、たたは localhost を登録するこずもできたす) を指定し、名前で保存する方法です。 inventory.
むンベントリ ファむルを䜿甚しお ansible を実行しおみるこずができたす。

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

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

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

指定したホストに ssh アクセスできる堎合、ansible はリモヌト システムに接続しお情報を収集したす。 (デフォルトのタスク [事実の収集]) その埌、実行に関する短いレポヌトが提䟛されたす (PLAY RECAP)。

デフォルトでは、接続ではシステムにログむンしおいるナヌザヌ名が䜿甚されたす。 おそらくホスト䞊には存圚しないでしょう。 Playbook ファむルでは、remote_user ディレクティブを䜿甚しお、接続に䜿甚するナヌザヌを指定できたす。 たた、リモヌト システムに関する情報は倚くの堎合䞍芁であるため、収集に時間を無駄にすべきではありたせん。 このタスクは無効にするこずもできたす。

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

プレむブックを再床実行しお、接続が機胜しおいるこずを確認しおください。 (root ナヌザヌを指定した堎合は、昇栌された暩限を取埗するために become: true ディレクティブも指定する必芁がありたす。ドキュメントに蚘茉されおいるように: become set to ‘true’/’yes’ to activate privilege escalation. その理由は完党には明らかではありたせんが。

おそらく、ansible が Python むンタヌプリタヌを決定できないこずが原因で゚ラヌが発生する可胜性がありたすが、その堎合は手動で指定できたす。

ansible_python_interpreter: /usr/bin/python3 

コマンドを䜿甚しおPythonがどこにあるかを確認できたす whereis python.

システムパッケヌゞのむンストヌル

Ansible の暙準ディストリビュヌションには、さたざたなシステム パッケヌゞを操䜜するためのモゞュヌルが倚数含たれおいるため、䜕らかの理由で bash スクリプトを䜜成する必芁はありたせん。 ここで、システムを曎新し、システム パッケヌゞをむンストヌルするには、これらのモゞュヌルの XNUMX ぀が必芁です。 VPS に Ubuntu Linux があるので、パッケヌゞをむンストヌルするために䜿甚したす 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

Task は、たさに Ansible がリモヌトサヌバヌ䞊で実行するタスクです。 タスクの実行をログで远跡できるように、タスクに名前を付けたす。 そしお、特定のモゞュヌルの構文を䜿甚しお、そのモゞュヌルが䜕を行う必芁があるかを説明したす。 この堎合 apt: update_cache=yes - apt モゞュヌルを䜿甚しおシステム パッケヌゞを曎新するように指瀺されおいたす。 XNUMX 番目のコマンドは少し耇雑です。 パッケヌゞのリストを apt モゞュヌルに枡し、それらが state なるはず present、぀たり、これらのパッケヌゞをむンストヌルするず蚀いたす。 同様の方法で、それらを削陀するか、単に倉曎するだけで曎新するように指瀺できたす。 state。 Rails を postgresql で動䜜させるには、珟圚むンストヌルしおいる postgresql-contrib パッケヌゞが必芁であるこずに泚意しおください。 繰り返したすが、これを知っお実行する必芁がありたす。ansible だけではこれを実行できたせん。

Playbook を再床実行しお、パッケヌゞがむンストヌルされおいるこずを確認しおください。

新しいナヌザヌの䜜成。

ナヌザヌず連携するために、Ansible にはナヌザヌずいうモゞュヌルもありたす。 もう XNUMX ぀タスクを远加したしょう (毎回完党にコピヌしないように、プレむブックの既知の郚分をコメントの埌ろに隠したした)。

---
- 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') }}"

倉数は二重䞭括匧を䜿甚しお Playbook に蚭定されたす。

むンベントリ ファむル内の倉数の倀を瀺したす。

123.123.123.123

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

指什に泚意しおください [all:vars] - テキストの次のブロックは倉数 (vars) であり、それらはすべおのホスト (all) に適甚できるず曞かれおいたす。

デザむンも面癜いですね "{{ user_password | password_hash('sha512') }}"。 問題は、ansible がナヌザヌをむンストヌルしないこずです。 user_add 手動で行うのず同じように。 たた、すべおのデヌタを盎接保存するため、事前にパスワヌドをハッシュに倉換する必芁もあり、それがこのコマンドの目的です。

ナヌザヌを sudo グルヌプに远加したしょう。 ただし、これを行う前に、そのようなグルヌプが存圚するこずを確認する必芁がありたす。これは、誰も私たちの代わりにやっおくれるわけではないためです。

---
- 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"

すべおは非垞に単玔です。apt に非垞によく䌌た構文を䜿甚しお、グルヌプを䜜成するための group モゞュヌルもありたす。 その埌、このグルヌプをナヌザヌに登録するだけで十分です (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 キヌの公開郚分をコピヌし、サヌバヌ䞊のナヌザヌの蚱可されたキヌのリストにアップロヌドしたす。

圹割

䜿甚を䜜成するための XNUMX ぀のタスクはすべお、XNUMX ぀のタスク グルヌプに簡単に分類できたす。倧きくなりすぎないように、このグルヌプをメむンのプレむブックずは別に保存するこずをお勧めしたす。 この目的のために、Ansible には 圹割.
䞀番最初に瀺したファむル構造に埓っお、ロヌルは別のロヌル ディレクトリに配眮する必芁がありたす。ロヌルごずに、タスク、ファむル、テンプレヌトなどのディレクトリ内に同じ名前の別のディレクトリがありたす。
ファむル構造を䜜成したしょう。 ./ansible/roles/user/tasks/main.yml (main は、ロヌルが Playbook に接続されるずきにロヌドされお実行されるメむン ファむルです。他のロヌル ファむルをそれに接続できたす)。 これで、ナヌザヌに関連するすべおのタスクをこのファむルに転送できるようになりたした。

# 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

次に、ファむルずテンプレヌトが必芁です。 それらの違いは、ansible がファむルをそのたた盎接コピヌするこずです。 たた、テンプレヌトには j2 拡匵子が必芁で、同じ二重䞭括匧を䜿甚しお倉数倀を䜿甚できたす。

nginxを有効にしおみたしょう main.yml ファむル。 このために systemd モゞュヌルがありたす。

# 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 構成ファむルを䜜成したす (サヌバヌから盎接取埗するこずも、自分で䜜成するこずもできたす)。 たた、アプリケヌションの構成ファむルも sites_available ディレクトリにありたす (これは必須ではありたせんが、䟿利です)。 最初のケヌスでは、copy モゞュヌルを䜿甚しおファむルをコピヌしたす (ファむルは /ansible/roles/nginx/files/nginx.conf。 XNUMX ぀目では、テンプレヌトをコピヌし、倉数の倀を眮き換えたす。 テンプレヌトは次のずおりです /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 }} — これらはすべお、Ansible がコピヌする前にその倀をテンプレヌトに代入する倉数です。 これは、ホストのさたざたなグルヌプに Playbook を䜿甚する堎合に䟿利です。 たずえば、むンベントリ ファむルを远加できたす。

[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 倉数 プレむブックが珟圚実行されおいるホストがそこに保存されたす。
耇数のホストのむンベントリ ファむルが必芁で、XNUMX ぀のグルヌプに察しおのみ実行したい堎合は、次のコマンドを䜿甚しお実行できたす。

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

もう XNUMX ぀のオプションは、異なるグルヌプに察しお個別のむンベントリ ファむルを甚意するこずです。 たたは、異なるホストが倚数ある堎合は、XNUMX ぀のアプロヌチを組み合わせるこずもできたす。

nginxの蚭定に戻りたしょう。 構成ファむルをコピヌした埌、sitest_enabled に sites_available から 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

ここではすべおが単玔です。やはり、かなり暙準的な構文を持぀ ansible モゞュヌルです。 しかし、ポむントが XNUMX ぀ありたす。 毎回nginxを再起動するのは意味がありたせん。 「これをこうする」ずいうようなコマンドを曞いおいるのではなく、構文は「これはこの状態でなければならない」ずいうようなものであるこずに気づいたでしょうか。 そしおほずんどの堎合、これがたさに ansible の仕組みです。 グルヌプがすでに存圚する堎合、たたはシステム パッケヌゞがすでにむンストヌルされおいる堎合、ansible はこれを確認しおタスクをスキップしたす。 たた、ファむルがサヌバヌ䞊に既に存圚するものず完党に䞀臎する堎合、ファむルはコピヌされたせん。 これを利甚しお、構成ファむルが倉曎された堎合にのみ nginx を再起動できたす。 これには register ディレクティブがありたす。

# 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のセットアップ

nginx の堎合ず同じ方法で systemd を䜿甚しお postgresql を有効にし、デヌタベヌスずデヌタベヌス自䜓ぞのアクセスに䜿甚するナヌザヌを䜜成する必芁がありたす。
ロヌルを䜜成したしょう /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。 実際のずころ、デフォルトでは、postgres ナヌザヌのみが postgresql デヌタベヌスにロヌカルでのみアクセスできたす。 このディレクティブにより、このナヌザヌに代わっおコマンドを実行できるようになりたす (もちろんアクセス暩がある堎合)。
たた、新しいナヌザヌがデヌタベヌスにアクセスできるようにするには、pg_hba.conf に行を远加する必芁がある堎合がありたす。 これは、nginx 構成を倉曎したのず同じ方法で行うこずができたす。

そしおもちろん、postgresql ロヌルをメむン プレむブックに远加する必芁がありたす。

rbenv経由でrubyをむンストヌルする

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

これらの目的のために䜜成したナヌザヌの䞋で䜜業するために、become_user ディレクティブを再床䜿甚したす。 rbenv はグロヌバルではなくホヌム ディレクトリにむンストヌルされるためです。 たた、git モゞュヌルを䜿甚しおリポゞトリのクロヌンを䜜成し、repo ず dest を指定したす。

次に、rbenv init を bashrc に登録し、そこの PATH に rbenv を远加する必芁がありたす。 このために、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

そしお最埌にrubyをむンストヌルしたす。 これは 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 を同じスクリプト内で盎接定矩する必芁があるこずを意味したす。

次の問題は、シェル コマンドには Ansible の芳点からは状態がないこずが原因です。 ぀たり、このバヌゞョンの Ruby がむンストヌルされおいるかどうかの自動チェックは行われたせん。 これは自分でも行うこずができたす。

- 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 をメむン プレむブックに远加したす。

共有ファむル。

通垞、セットアップはここで完了したす。 次に、残っおいるのは、capistrano を実行するこずだけです。これにより、コヌド自䜓がコピヌされ、必芁なディレクトリが䜜成され、アプリケヌションが起動されたす (すべおが正しく構成されおいる堎合)。 ただし、capistrano では倚くの堎合、次のような远加の構成ファむルが必芁になりたす。 database.yml たたは .env これらは、nginx のファむルやテンプレヌトず同じようにコピヌできたす。 埮劙な点が XNUMX ぀だけありたす。 ファむルをコピヌする前に、次のようなディレクトリ構造を䜜成する必芁がありたす。

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

ディレクトリを XNUMX ぀だけ指定するず、必芁に応じお Ansible が自動的に芪ディレクトリを䜜成したす。

アンシブルボヌルト

倉数にはナヌザヌのパスワヌドなどの機密デヌタが含たれる可胜性があるずいう事実はすでにわかっおいたす。 䜜成した堎合 .env アプリケヌション甚のファむル、および database.yml そうするず、そのような重芁なデヌタがさらに存圚するはずです。 芗き芋から隠すのが良いでしょう。 この目的のために䜿甚されたす ansible ボヌルト.

倉数甚のファむルを䜜成したしょう /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 はパスワヌドを芁求し、倉数を取埗し、タスクを実行したす。 すべおのデヌタは暗号化されたたたになりたす。

ホストのいく぀かのグルヌプず Ansible Vault の完党なコマンドは次のようになりたす。

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

ただし、プレむブックずロヌルの党文は提䟛したせん。自分で曞いおください。 ansible はそのようなものであるため、䜕をする必芁があるのか​​理解しおいなければ、それを行うこずはできたせん。

出所 habr.com

コメントを远加したす