Thứ ba, 02/10/2018 | 00:00 GMT+7

Làm thế nào để kiểm tra các vai trò không thể phục hồi với Molecule trên Ubuntu 18.04

Kiểm tra đơn vị trong Ansible là key đảm bảo các role hoạt động như dự định. Molecule làm cho quá trình này dễ dàng hơn bằng cách cho phép bạn chỉ định các tình huống kiểm tra các role trong các môi trường khác nhau. Sử dụng Ansible dưới mui xe, Molecule giảm tải các role cho người cung cấp triển khai role trong môi trường được cấu hình và gọi một trình xác minh (chẳng hạn như Testinfra ) để kiểm tra độ lệch cấu hình. Điều này đảm bảo role của bạn đã thực hiện tất cả những thay đổi dự kiến đối với môi trường trong kịch bản cụ thể đó.

Trong hướng dẫn này, bạn sẽ xây dựng một role Ansible triển khai Apache cho một server và cấu hình firewalld trên CentOS 7. Để kiểm tra xem role này có hoạt động như dự định hay không, bạn sẽ tạo một bài kiểm tra trong Molecule bằng cách sử dụng Docker làm trình điều khiển và Testinfra, một thư viện Python để kiểm tra trạng thái của server . Molecule sẽ cung cấp các containers Docker để kiểm tra role và Testinfra sẽ xác minh server đã được cấu hình như dự định. Khi hoàn tất, bạn có thể tạo nhiều trường hợp thử nghiệm cho các bản dựng trên các môi trường và chạy các thử nghiệm này bằng Molecule.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:

Bước 1 - Chuẩn bị Môi trường

Nếu bạn đã tuân theo các yêu cầu , bạn nên cài đặt và cấu hình đúng Python 3, venv và Docker. Hãy bắt đầu bằng cách tạo một môi trường ảo để kiểm tra Ansible với Molecule.

Bắt đầu bằng cách đăng nhập với quyền là user không phải root của bạn và tạo một môi trường ảo mới:

  • python3 -m venv my_env

Kích hoạt nó đảm bảo rằng các hành động của bạn bị hạn chế trong môi trường đó:

  • source my_env/bin/activate

Tiếp theo, trong môi trường đã kích hoạt của bạn, hãy cài đặt gói wheel , gói này cung cấp phần mở rộng bdist_wheel setuptoolspip sử dụng để cài đặt Ansible:

  • python3 -m pip install wheel

Đến đây bạn có thể cài đặt moleculedocker bằng pip . Ansible sẽ được tự động cài đặt như một phụ thuộc cho Molecule:

  • python3 -m pip install molecule docker

Đây là những gì mỗi gói này sẽ làm:

  • molecule : Đây là gói Phân tử chính mà bạn sẽ sử dụng để kiểm tra các role . Cài đặt molecule tự động cài đặt Ansible, cùng với các phụ thuộc khác và cho phép sử dụng sách chơi Ansible để thực hiện các role và thử nghiệm.
  • docker : Thư viện Python này được Molecule sử dụng để giao tiếp với Docker. Bạn cần điều này vì bạn đang sử dụng Docker làm trình điều khiển.

Tiếp theo, hãy tạo một role trong Molecule.

Bước 2 - Tạo role trong phân tử

Với môi trường của bạn được cài đặt , bạn có thể sử dụng Molecule để tạo một role cơ bản mà bạn sẽ sử dụng để kiểm tra cài đặt Apache. Role này sẽ tạo cấu trúc folder và một số thử nghiệm ban đầu, đồng thời chỉ định Docker làm trình điều khiển để Molecule sử dụng Docker để chạy các thử nghiệm của nó.

Tạo một role mới được gọi là ansible-apache :

  • molecule init role -r ansible-apache -d docker

Cờ -r chỉ định tên của role trong khi -d chỉ định trình điều khiển, cung cấp các server cho Molecule sử dụng trong thử nghiệm.

Thay đổi folder của role mới được tạo:

  • cd ansible-apache

Kiểm tra role mặc định để kiểm tra xem Molecule đã được cài đặt đúng cách chưa:

  • molecule test

Bạn sẽ thấy kết quả liệt kê từng hành động thử nghiệm mặc định. Trước khi bắt đầu thử nghiệm, Molecule xác nhận file cấu hình molecule.yml đảm bảo mọi thứ đều theo thứ tự. Nó cũng in ma trận kiểm tra này, chỉ định thứ tự của các hành động kiểm tra:

Output
--> Validating schema /home/sammy/ansible-apache/molecule/default/molecule.yml. Validation completed successfully. --> Test matrix └── default ├── lint ├── destroy ├── dependency ├── syntax ├── create ├── prepare ├── converge ├── idempotence ├── side_effect ├── verify └── destroy ...

Ta sẽ thảo luận chi tiết về từng hành động thử nghiệm sau khi bạn đã tạo role và tùy chỉnh các thử nghiệm của bạn . Hiện tại, hãy chú ý đến PLAY_RECAP cho mỗi lần kiểm tra và đảm bảo không có hành động mặc định nào trả về trạng thái failed . Ví dụ: PLAY_RECAP cho hành động 'create' mặc định sẽ giống như sau:

Output
... PLAY RECAP ********************************************************************* localhost : ok=5 changed=4 unreachable=0 failed=0

Hãy chuyển sang sửa đổi role để cấu hình Apache và firewalld.

Bước 3 - Cấu hình Apache và Firewalld

Để cấu hình Apache và firewalld, bạn sẽ tạo một file nhiệm vụ cho role , chỉ định các gói để cài đặt và các dịch vụ để bật. Các chi tiết này sẽ được extract từ file biến và mẫu mà bạn sẽ sử dụng để thay thế trang index Apache mặc định.

Vẫn trong folder ansible-apache , hãy tạo file nhiệm vụ cho role bằng nano hoặc editor yêu thích của bạn:

  • nano tasks/main.yml

Bạn sẽ thấy rằng file đã tồn tại. Xóa những gì ở đó và thay thế nó bằng mã sau để cài đặt các gói bắt buộc và bật các dịch vụ chính xác, mặc định HTML và cài đặt firewall :

~ / ansible-apache / task / main.yml
--- - name: "Ensure required packages are present"   yum:     name: "{{ pkg_list }}"     state: present  - name: "Ensure latest index.html is present"   template:     src: index.html.j2     dest: /var/www/html/index.html  - name: "Ensure httpd service is started and enabled"   service:     name: "{{ item }}"     state: started     enabled: true   with_items: "{{ svc_list }}"  - name: "Whitelist http in firewalld"   firewalld:     service: http     state: enabled     permanent: true     immediate: true 

Playbook này bao gồm 4 nhiệm vụ:

  • "Ensure required packages are present" : Tác vụ này sẽ cài đặt các gói được liệt kê trong file biến dưới pkg_list . Tệp biến sẽ được đặt tại ~/ansible-apache/vars/main.yml và bạn sẽ tạo nó ở cuối bước này.
  • "Ensure latest index.html is present" : Tác vụ này sẽ sao chép một trang mẫu, index.html.j2 và dán nó lên file index mặc định, /var/www/html/index.html , do Apache tạo. Bạn cũng cần tạo mẫu mới trong bước này.
  • "Ensure httpd service is started and enabled" : Tác vụ này sẽ bắt đầu và kích hoạt các dịch vụ được liệt kê trong svc_list trong file biến.
  • "Whitelist http in firewalld" : Tác vụ này sẽ đưa dịch vụ http trong firewalld vào danh sách trắng. Firewalld là một giải pháp firewall hoàn chỉnh có sẵn theo mặc định trên các server CentOS. Để dịch vụ http hoạt động, bạn cần phải hiển thị các cổng cần thiết. Hướng dẫn firewalld lập danh sách trắng một dịch vụ đảm bảo nó sẽ đưa vào danh sách trắng tất cả các cổng mà dịch vụ yêu cầu.

Lưu file khi bạn hoàn tất.

Tiếp theo, hãy tạo ra một templates folder cho index.html.j2 trang mẫu:

  • mkdir templates

Tự tạo trang:

  • nano templates/index.html.j2

Dán vào mã bảng soạn sẵn sau:

~ / ansible-apache / templates / index.html.j2
<div style="text-align: center">     <h2>Managed by Ansible</h2> </div> 

Lưu và đóng file .

Bước cuối cùng để hoàn thành role là viết file biến, file này cung cấp tên của các gói và dịch vụ vào sổ chơi role chính của ta :

  • nano vars/main.yml

Dán lên nội dung mặc định bằng mã sau, mã này chỉ định pkg_listsvc_list :

~ / ansible-apache / vars / main.yml
--- pkg_list:   - httpd   - firewalld svc_list:   - httpd   - firewalld 

Các danh sách này chứa các thông tin sau:

  • pkg_list : Phần này chứa tên của các gói mà role sẽ cài đặt: httpdfirewalld .
  • svc_list : Phần này chứa tên của các dịch vụ mà role sẽ bắt đầu và kích hoạt: httpdfirewalld .

Lưu ý: Đảm bảo rằng file biến của bạn không có bất kỳ dòng trống nào, nếu không quá trình kiểm tra của bạn sẽ thất bại trong quá trình linting.

Đến đây bạn đã hoàn thành việc tạo role của bạn , hãy cấu hình Molecule để kiểm tra xem nó có hoạt động như dự định không.

Bước 4 - Sửa đổi role để chạy thử nghiệm

Trong trường hợp của ta , cấu hình phân tử liên quan đến việc sửa đổi các file cấu hình phân tử molecule.yml để thêm thông số kỹ thuật nền tảng. Vì bạn đang thử nghiệm một role cấu hình và khởi động dịch vụ httpd systemd, bạn cần sử dụng một hình ảnh đã được cấu hình systemd và bật chế độ quyền . Đối với hướng dẫn này, bạn sẽ sử dụng hình ảnh milcom/centos7-systemd có sẵn trên Docker Hub . Chế độ quyền cho phép các containers chạy với hầu hết các khả năng của server của chúng.

Hãy chỉnh sửa molecule.yml để áp dụng thay đổi này:

  • nano molecule/default/molecule.yml

Thêm thông tin nền tảng được đánh dấu:

~ / ansible-apache / phân tử / mặc định / phân tử.yml
--- dependency:   name: galaxy driver:   name: docker lint:   name: yamllint platforms:   - name: centos7     image: milcom/centos7-systemd     privileged: true provisioner:   name: ansible   lint:     name: ansible-lint scenario:   name: default verifier:   name: testinfra   lint:     name: flake8 

Lưu file khi bạn hoàn tất.

Đến đây bạn đã cấu hình thành công môi trường thử nghiệm, hãy chuyển sang viết các trường hợp thử nghiệm mà Molecule sẽ chạy trên containers của bạn sau khi thực thi role .

Bước 5 - Viết các trường hợp kiểm tra

Trong bài kiểm tra cho role này, bạn sẽ kiểm tra các điều kiện sau:

  • Các gói httpdfirewalld được cài đặt.
  • Rằng các dịch vụ httpdfirewalld đang chạy và được kích hoạt.
  • Dịch vụ http được bật trong cài đặt firewall của bạn.
  • index.html đó chứa cùng một dữ liệu được chỉ định trong file mẫu của bạn.

Nếu tất cả các bài kiểm tra này đều vượt qua, thì role sẽ hoạt động như dự định.

Để viết các trường hợp thử nghiệm cho các điều kiện này, hãy chỉnh sửa các thử nghiệm mặc định trong ~/ansible-apache/molecule/default/tests/test_default.py . Sử dụng Testinfra, ta sẽ viết các trường hợp thử nghiệm dưới dạng các hàm Python sử dụng các lớp Molecule.

Mở test_default.py :

  • nano molecule/default/tests/test_default.py

Xóa nội dung của file để bạn có thể viết các bài kiểm tra từ đầu.

Lưu ý: Khi bạn viết các bài kiểm tra của bạn , hãy đảm bảo chúng cách nhau hai dòng mới nếu không chúng sẽ bị trượt.

Bắt đầu bằng lệnh các module Python được yêu cầu:

~ / ansible-apache / phân tử / default / tests / test_default.py
import os import pytest  import testinfra.utils.ansible_runner 

Các module này bao gồm:

  • os : Mô-đun Python tích hợp này cho phép chức năng phụ thuộc vào hệ điều hành, giúp Python có thể giao tiếp với hệ điều hành cơ bản.
  • pytest : Mô-đun pytest cho phép viết thử nghiệm.
  • testinfra.utils.ansible_runner : Mô-đun Testinfra này sử dụng Ansible làm phần backend để thực thi lệnh.

Trong phần nhập module , hãy thêm mã sau, mã này sử dụng phần backend Ansible để trả về version server hiện tại:

~ / ansible-apache / phân tử / default / tests / test_default.py
... testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(     os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all') 

Với file thử nghiệm của bạn được cấu hình để sử dụng phần backend Ansible, hãy viết các bài kiểm tra đơn vị để kiểm tra trạng thái của server .

Thử nghiệm đầu tiên sẽ đảm bảo httpdfirewalld được cài đặt:

~ / ansible-apache / phân tử / default / tests / test_default.py
...  @pytest.mark.parametrize('pkg', [   'httpd',   'firewalld' ]) def test_pkg(host, pkg):     package = host.package(pkg)      assert package.is_installed 

Kiểm tra bắt đầu với trình trang trí pytest.mark.parametrize , cho phép ta tham số hóa các đối số cho kiểm tra. Thử nghiệm đầu tiên này sẽ lấy test_pkg làm tham số để kiểm tra sự hiện diện của gói httpdfirewalld .

Thử nghiệm tiếp theo kiểm tra xem httpdfirewalld có đang chạy và được kích hoạt hay không. Nó nhận test_svc làm tham số:

~ / ansible-apache / phân tử / default / tests / test_default.py
...  @pytest.mark.parametrize('svc', [   'httpd',   'firewalld' ]) def test_svc(host, svc):     service = host.service(svc)      assert service.is_running     assert service.is_enabled 

Lần kiểm tra cuối cùng kiểm tra xem các file và nội dung được chuyển tới parametrize() có tồn tại hay không. Nếu file không do role của bạn tạo và nội dung không được đặt đúng cách, thì assert sẽ trả về False :

~ / ansible-apache / phân tử / default / tests / test_default.py
...  @pytest.mark.parametrize('file, content', [   ("/etc/firewalld/zones/public.xml", "<service name=\"http\"/>"),   ("/var/www/html/index.html", "Managed by Ansible") ]) def test_files(host, file, content):     file = host.file(file)      assert file.exists     assert file.contains(content) 

Trong mỗi thử nghiệm, assert sẽ trả về True hoặc False tùy thuộc vào kết quả thử nghiệm.

Tệp đã hoàn thành trông như thế này:

~ / ansible-apache / phân tử / default / tests / test_default.py
import os import pytest  import testinfra.utils.ansible_runner  testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(     os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')   @pytest.mark.parametrize('pkg', [   'httpd',   'firewalld' ]) def test_pkg(host, pkg):     package = host.package(pkg)      assert package.is_installed   @pytest.mark.parametrize('svc', [   'httpd',   'firewalld' ]) def test_svc(host, svc):     service = host.service(svc)      assert service.is_running     assert service.is_enabled   @pytest.mark.parametrize('file, content', [   ("/etc/firewalld/zones/public.xml", "<service name=\"http\"/>"),   ("/var/www/html/index.html", "Managed by Ansible") ]) def test_files(host, file, content):     file = host.file(file)      assert file.exists     assert file.contains(content) 

Đến đây bạn đã chỉ định các trường hợp thử nghiệm của bạn , hãy kiểm tra role .

Bước 6 - Kiểm tra role với phân tử

Khi bạn bắt đầu kiểm tra, Molecule sẽ thực hiện các hành động bạn đã xác định trong kịch bản của bạn . Bây giờ ta hãy chạy lại kịch bản molecule mặc định, thực hiện các hành động trong trình tự thử nghiệm mặc định trong khi xem xét kỹ hơn từng hành động.

Chạy lại thử nghiệm cho kịch bản mặc định:

  • molecule test

Điều này sẽ bắt đầu chạy thử nghiệm. Đầu ra ban đầu in ma trận kiểm tra mặc định:

Output
--> Validating schema /home/sammy/ansible-apache/molecule/default/molecule.yml. Validation completed successfully. --> Test matrix └── default ├── lint ├── destroy ├── dependency ├── syntax ├── create ├── prepare ├── converge ├── idempotence ├── side_effect ├── verify └── destroy

Hãy xem qua từng hành động thử nghiệm và kết quả kết quả mong đợi, bắt đầu với linting.

Hành động linting thực thi yamllint , flake8ansible-lint :

  • yamllint : Liên kết này được thực thi trên tất cả các file YAML có trong folder role .
  • flake8 : Trình liên kết mã Python này kiểm tra các bài kiểm tra được tạo cho Testinfra.
  • ansible-lint : Linter cho sách phát Ansible này được thực thi trong tất cả các trường hợp.
Output
... --> Scenario: 'default' --> Action: 'lint' --> Executing Yamllint on files found in /home/sammy/ansible-apache/... Lint completed successfully. --> Executing Flake8 on files found in /home/sammy/ansible-apache/molecule/default/tests/... Lint completed successfully. --> Executing Ansible Lint on /home/sammy/ansible-apache/molecule/default/playbook.yml... Lint completed successfully.

Hành động tiếp theo, hủy , được thực hiện bằng cách sử dụng file destroy.yml . Điều này được thực hiện để kiểm tra role của ta trên một containers mới được tạo.

Theo mặc định, hủy được gọi hai lần: khi bắt đầu chạy thử, để xóa bất kỳ containers nào đã có từ trước và ở cuối, để xóa containers mới được tạo:

Output
... --> Scenario: 'default' --> Action: 'destroy' PLAY [Destroy] ***************************************************************** TASK [Destroy molecule instance(s)] ******************************************** changed: [localhost] => (item=None) changed: [localhost] TASK [Wait for instance(s) deletion to complete] ******************************* ok: [localhost] => (item=None) ok: [localhost] TASK [Delete docker network(s)] ************************************************ skipping: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0

Sau khi hành động hủy hoàn tất, kiểm tra sẽ chuyển sang phụ thuộc . Hành động này cho phép bạn kéo các phụ thuộc từ ansible-galaxy nếu role của bạn yêu cầu chúng. Trong trường hợp này, role của ta không:

Output
... --> Scenario: 'default' --> Action: 'dependency' Skipping, missing the requirements file.

Hành động kiểm tra tiếp theo là kiểm tra cú pháp , được thực thi trên playbook.yml mặc định. Nó hoạt động theo cách tương tự như cờ --syntax-check trong lệnh ansible-playbook --syntax-check playbook.yml :

Output
... --> Scenario: 'default' --> Action: 'syntax' playbook: /home/sammy/ansible-apache/molecule/default/playbook.yml

Tiếp theo, kiểm tra chuyển sang hành động tạo . Điều này sử dụng file create.yml trong folder Molecule của role của bạn để tạo containers Docker với các thông số kỹ thuật của bạn:

Output
... --> Scenario: 'default' --> Action: 'create' PLAY [Create] ****************************************************************** TASK [Log into a Docker registry] ********************************************** skipping: [localhost] => (item=None) skipping: [localhost] TASK [Create Dockerfiles from image names] ************************************* changed: [localhost] => (item=None) changed: [localhost] TASK [Discover local Docker images] ******************************************** ok: [localhost] => (item=None) ok: [localhost] TASK [Build an Ansible compatible image] *************************************** changed: [localhost] => (item=None) changed: [localhost] TASK [Create docker network(s)] ************************************************ skipping: [localhost] TASK [Create molecule instance(s)] ********************************************* changed: [localhost] => (item=None) changed: [localhost] TASK [Wait for instance(s) creation to complete] ******************************* changed: [localhost] => (item=None) changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=5 changed=4 unreachable=0 failed=0

Sau khi tạo, kiểm tra chuyển sang hành động chuẩn bị . Hành động này thực hiện playbook chuẩn bị, đưa server đến một trạng thái cụ thể trước khi chạy hội tụ. Điều này hữu ích nếu role của bạn yêu cầu cấu hình trước hệ thống trước khi role được thực thi. , điều này không áp dụng cho role của ta :

Output
... --> Scenario: 'default' --> Action: 'prepare' Skipping, prepare playbook not configured.

Sau khi chuẩn bị, hành động hội tụ thực hiện role của bạn trên containers bằng cách chạy playbook.yml playbook. Nếu nhiều nền tảng được cấu hình trong molecule.yml file , phân tử sẽ hội tụ trên tất cả các:

Output
... --> Scenario: 'default' --> Action: 'converge' PLAY [Converge] **************************************************************** TASK [Gathering Facts] ********************************************************* ok: [centos7] TASK [ansible-apache : Ensure required packages are present] ******************* changed: [centos7] TASK [ansible-apache : Ensure latest index.html is present] ******************** changed: [centos7] TASK [ansible-apache : Ensure httpd service is started and enabled] ************ changed: [centos7] => (item=httpd) changed: [centos7] => (item=firewalld) TASK [ansible-apache : Whitelist http in firewalld] **************************** changed: [centos7] PLAY RECAP ********************************************************************* centos7 : ok=5 changed=4 unreachable=0 failed=0

Sau khi được che đậy, bài kiểm tra sẽ chuyển sang tính không cần thiết . Hành động này sẽ kiểm tra playbook để tìm sự cố định đảm bảo không có thay đổi bất ngờ nào được thực hiện trong nhiều lần chạy:

Output
... --> Scenario: 'default' --> Action: 'idempotence' Idempotence completed successfully.

Hành động thử nghiệm tiếp theo là hành động tác dụng phụ . Điều này cho phép bạn tạo ra các tình huống trong đó bạn có thể kiểm tra nhiều thứ hơn, chẳng hạn như chuyển đổi dự phòng HA. Theo mặc định, Molecule không cấu hình playbook hiệu ứng phụ và tác vụ bị bỏ qua:

Output
... --> Scenario: 'default' --> Action: 'side_effect' Skipping, side effect playbook not configured.

Sau đó, Molecule sẽ chạy hành động xác minh bằng trình xác minh mặc định, Testinfra. Hành động này thực thi các bài kiểm tra bạn đã viết trước đó trong test_default.py . Nếu tất cả các bài kiểm tra vượt qua thành công, bạn sẽ thấy một thông báo thành công và Molecule sẽ tiến hành bước tiếp theo:

Output
... --> Scenario: 'default' --> Action: 'verify' --> Executing Testinfra tests found in /home/sammy/ansible-apache/molecule/default/tests/... ============================= test session starts ============================== platform linux -- Python 3.6.5, pytest-3.7.3, py-1.5.4, pluggy-0.7.1 rootdir: /home/sammy/ansible-apache/molecule/default, inifile: plugins: testinfra-1.14.1 collected 6 items tests/test_default.py ...... [100%] ========================== 6 passed in 41.05 seconds =========================== Verifier completed successfully.

Cuối cùng, Molecule hủy các trường hợp đã hoàn thành trong quá trình kiểm tra và xóa mạng được gán cho các trường hợp đó:

Output
... --> Scenario: 'default' --> Action: 'destroy' PLAY [Destroy] ***************************************************************** TASK [Destroy molecule instance(s)] ******************************************** changed: [localhost] => (item=None) changed: [localhost] TASK [Wait for instance(s) deletion to complete] ******************************* changed: [localhost] => (item=None) changed: [localhost] TASK [Delete docker network(s)] ************************************************ skipping: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=2 unreachable=0 failed=0

Các hành động kiểm tra hiện đã hoàn tất, xác minh role của bạn đã hoạt động như dự kiến.

Kết luận

Trong bài viết này, bạn đã tạo một role Ansible để cài đặt và cấu hình Apache và firewalld. Sau đó, bạn đã viết các bài kiểm tra đơn vị với Testinfra mà Molecule sử dụng để khẳng định rằng role đã chạy thành công.

Bạn có thể sử dụng cùng một phương pháp cơ bản cho các role có độ phức tạp cao và tự động hóa thử nghiệm bằng cách sử dụng đường ống CI. Molecule là một công cụ có cấu hình cao được dùng để kiểm tra các role với bất kỳ nhà cung cấp nào mà Ansible hỗ trợ, không chỉ Docker. Cũng có thể tự động kiểm tra đối với cơ sở hạ tầng của bạn , đảm bảo các role của bạn luôn được cập nhật và hoạt động hiệu quả. Bạn có thể tích hợp kiểm tra liên tục vào quy trình làm việc của bạn bằng cách sử dụng Molecule và Travis CI với hướng dẫn Cách thực hiện kiểm tra liên tục các role không thể phục hồi bằng Molecule và Travis CI trên Ubuntu 18.04 hướng dẫn.

Tài liệu chính thức về Molecule là tài nguyên tốt nhất để học cách sử dụng Molecule.


Tags:

Các tin liên quan

Cách cài đặt và bảo mật Mosquitto MQTT Messaging Broker trên Ubuntu 18.04 [Quickstart]
2018-07-16
Cách bật SFTP mà không cần quyền truy cập Shell trên Ubuntu 18.04
2018-07-13
Cách cài đặt Ruby on Rails với rbenv trên Ubuntu 18.04
2018-07-13
Cách cài đặt Git trên Ubuntu 18.04 [Quickstart]
2018-07-12
Cách cài đặt và bảo mật Mosquitto MQTT Messaging Broker trên Ubuntu 18.04
2018-07-12
Cách sử dụng Chế độ độc lập của Certbot để truy xuất chứng chỉ SSL Let's Encrypt trên Ubuntu 18.04
2018-07-11
Cách cài đặt WordPress với LEMP trên Ubuntu 18.04
2018-07-11
Cách sử dụng LVM để quản lý thiết bị lưu trữ trên Ubuntu 18.04
2018-07-11
Cách thiết lập đồng bộ hóa thời gian trên Ubuntu 18.04
2018-07-10
Cách cài đặt Hadoop ở chế độ độc lập trên Ubuntu 18.04
2018-07-10