Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS

Sau khi làm quen với Ansible Error Handling DevOps ở bài trước, mình đã thấy xử lý lỗi trong playbook “bình tĩnh” thế nào – không còn panic khi fail nữa. Nhưng hồi đó, mình vẫn quản lý server kiểu truyền thống, SSH tay vào từng EC2 instance trên AWS để cài package – mệt muốn xỉu. Rồi mình phát hiện Ansible AWS DevOps, và đúng là bước ngoặt “chơi lớn”! Ansible không chỉ quản lý server on-premise mà còn làm việc với cloud như AWS, Azure, hay GCP. Hôm nay, mình sẽ kể bạn nghe Ansible AWS DevOps là gì, cách dùng Ansible để quản lý AWS, và cùng thực hành tạo một EC2 instance với playbook. Cùng bắt đầu nhé!

Ansible AWS DevOps Là Gì? – “Cánh Tay Đắc Lực” Trên Cloud

Nói đơn giản, Ansible AWS DevOps là cách dùng Ansible để tự động hóa việc quản lý tài nguyên trên AWS, từ tạo EC2 instance, cấu hình security group, đến deploy ứng dụng. Bạn có thể tưởng tượng Ansible như “cánh tay đắc lực” – thay vì vào AWS Console click tay từng bước, bạn viết playbook, Ansible sẽ lo hết. Hồi mới làm DevOps, mình toàn SSH tay vào EC2 để cài Nginx, mỗi lần thêm instance là phải làm lại từ đầu – vừa chậm vừa dễ sai.

Có lần mình cần tạo 5 EC2 instance cho dự án, ngồi click tay trên AWS Console mất cả buổi, chưa kể cấu hình sai security group, làm server không truy cập được. Sau đó, mình mò ra Ansible AWS DevOps, dùng module ec2_instance để tạo instance, và mọi thứ nhanh hơn cả Flash chạy đua! Ansible hỗ trợ hàng loạt module AWS (như ec2_instance, s3_bucket, iam), giúp tự động hóa gần như mọi thứ trên cloud – đúng là “vũ khí” cho dân DevOps!

Chuẩn Bị Trước Khi Quản Lý AWS

Để dùng Ansible AWS DevOps, bạn cần chuẩn bị vài thứ:

  1. Cài Module AWS Cho Ansible: Ansible cần thư viện boto3 để làm việc với AWS. Cài đặt:

    pip install boto3

    Mình từng quên cài boto3, chạy playbook báo lỗi “No module named boto” – mất cả tiếng mới phát hiện.

  2. Cấu Hình AWS Credentials: Bạn cần Access Key ID và Secret Access Key từ AWS IAM. Tạo file ~/.aws/credentials:

    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_KEY

    Hoặc set biến môi trường:

    export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
    export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
    export AWS_DEFAULT_REGION=us-east-1

    Mình hay dùng biến môi trường để tránh lưu key trong file – an toàn hơn.

  3. Inventory Đã Sẵn Sàng: Dùng inventory từ bài 2 (hosts), nhưng lát nữa mình sẽ tạo instance mới, nên tạm thời không cần.

Tạo EC2 Instance Với Ansible – Thực Hành Ngay

Giờ mình sẽ dùng Ansible AWS DevOps để tạo một EC2 instance và chạy “Hello World” trên đó. Cùng làm từng bước nhé!

  1. Tạo Playbook Tạo EC2: Tạo file create_ec2.yml:

    - name: Create EC2 instance on AWS
     hosts: localhost
     connection: local
     vars:
       instance_type: t2.micro
       region: us-east-1
       ami_id: ami-0c55b159cbfafe1f0  # Amazon Linux 2 AMI (us-east-1)
       key_name: my-key-pair
     tasks:
       - name: Create EC2 instance
         amazon.aws.ec2_instance:
           name: "ansible-test-instance"
           key_name: "{{ key_name }}"
           instance_type: "{{ instance_type }}"
           image_id: "{{ ami_id }}"
           wait: yes
           region: "{{ region }}"
           security_group: default
           network:
             assign_public_ip: yes
           tags:
             Environment: Testing
         register: ec2
       - name: Debug instance info
         debug:
           msg: "Instance created with ID {{ ec2.instances[0].instance_id }} and IP {{ ec2.instances[0].public_ip_address }}"
    • hosts: localhost: Chạy trên máy local (vì chưa có server).
    • amazon.aws.ec2_instance: Module tạo EC2 instance.
    • register: ec2: Lưu thông tin instance để dùng sau.

    Lưu ý: Thay key_name bằng SSH key pair của bạn trên AWS, và ami_id bằng AMI phù hợp với region.

  2. Chạy Playbook:

    ansible-playbook create_ec2.yml

    Kết quả:

    TASK [Create EC2 instance] ************
    changed: [localhost]
    
    TASK [Debug instance info] ************
    ok: [localhost] => {
       "msg": "Instance created with ID i-1234567890abcdef0 and IP 54.123.45.67"
    }

    Mình từng quên wait: yes, làm playbook chạy trước khi instance sẵn sàng – lỗi ngay lập tức. Nên nhớ: Thêm wait: yes để Ansible chờ instance khởi động.

  3. Thêm Instance Vào Inventory: Lấy IP từ output (VD: 54.123.45.67), thêm vào file hosts:

    [new_servers]
    ansible-test ansible_host=54.123.45.67 ansible_user=ec2-user ansible_ssh_private_key_file=~/.ssh/my-key.pem
  4. Chạy “Hello World” Trên Instance: Tạo file hello_world.yml:

    - name: Run Hello World on new instance
     hosts: new_servers
     tasks:
       - name: Create hello file
         copy:
           content: "Hello World from Ansible on AWS!"
           dest: /tmp/hello.txt
           mode: '0644'
       - name: Debug hello file
         shell: cat /tmp/hello.txt
         register: hello_output
       - name: Print hello message
         debug:
           msg: "{{ hello_output.stdout }}"

    Chạy:

    ansible-playbook -i hosts hello_world.yml

    Kết quả:

    ok: [ansible-test] => {
       "msg": "Hello World from Ansible on AWS!"
    }

    Mình từng quên ansible_ssh_private_key_file, làm SSH fail – mất cả tiếng debug. Nên nhớ: Đảm bảo key pair khớp với key_name!

Mẹo Nhỏ Từ Kinh Nghiệm Thật

  • Dùng wait_timeout: Nếu instance khởi động lâu, thêm wait_timeout:
    wait_timeout: 300

    Mình từng để mặc định, instance chậm khởi động, playbook fail.

  • Kiểm tra quyền IAM: Đảm bảo IAM user có quyền ec2:* – nếu không, bạn sẽ gặp lỗi “Access Denied”.
  • Sao lưu key: Đừng để mất SSH key, mình từng làm mất, phải tạo instance mới – tốn cả buổi.

Có lần mình tạo EC2 nhưng quên mở port 22 trong security group, SSH không được, playbook fail liên tục. Mình nghĩ “Chắc Ansible lỗi”, ngồi debug cả ngày, cuối cùng mới phát hiện security group sai. Từ đó, mình luôn kiểm tra port trước có những lỗi nhỏ mà cứ tìm đâu đâu :)))

Cảm Nhận Sau Khi Dùng Ansible Với AWS

Lần đầu dùng Ansible AWS DevOps, mình thấy nó như “cánh tay đắc lực” – không còn click tay trên AWS Console nữa, chỉ viết playbook là xong. So với SSH tay, Ansible tiết kiệm thời gian và giảm lỗi kinh khủng. Cảm giác như vừa “chơi lớn” với DevOps – tự động hóa cloud mà không phức tạp!

Tiếp Theo Là Gì?

Bài này tụi mình đã làm quen với Ansible AWS DevOps, từ tạo EC2 đến chạy “Hello World”. Lần sau, mình sẽ kể bạn nghe về dynamic inventory – cách tự động lấy danh sách instance từ AWS, không cần thêm tay vào hosts. Chịu không?

Thử Nghiệm Nhẹ: Thử thêm task tạo security group (dùng module ec2_group) trước khi tạo instance, mở port 80. Có gì thắc mắc cứ nhắn mình nhé – quản lý cloud là bước lớn, làm quen tốt là bạn đã sẵn sàng cho dự án thật!

Điều hướng chuỗi bài viết<< Bài 10: Ansible Error Handling – Không Panic Khi Fail
>> Bài 12: Ansible Dynamic Inventory – Danh Sách Server Tự Động
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận