Thursday, November 21, 2024

[Ansible] Tự viết module cho Ansible

-

1. Tổng quan.

Module trong Ansible là một tập hợp các tác vụ được sử dụng để thực hiện các công việc trên các máy chủ hoặc thiết bị khác nhau. Ansible cung cấp nhiều module để quản lý hệ thống và ứng dụng, từ việc cài đặt phần mềm, tạo tập tin đến quản lý cơ sở dữ liệu và các ứng dụng web.

Việc viết module cho Ansible có thể giúp bạn tùy chỉnh và mở rộng khả năng của Ansible, giúp bạn thực hiện các tác vụ cụ thể hoặc tích hợp với các công cụ khác trong hệ thống của bạn. Bằng cách tự viết module, bạn có thể đáp ứng các yêu cầu đặc biệt của doanh nghiệp của bạn và giảm thiểu sự phụ thuộc vào các module có sẵn mà bạn không quản lý được.

Ngoài ra, việc viết module cho Ansible cũng giúp bạn cải thiện kỹ năng lập trình Python và hiểu sâu về cách hoạt động của Ansible.

2. Sử dụng Python.

Sử dụng Python để tự viết module cho Ansible là một cách tuyệt vời để tùy chỉnh và mở rộng khả năng của Ansible. Dưới đây là các bước cơ bản để bạn có thể tự viết một module Python cho Ansible:

Tạo thư mục chứa module của bạn. Chẳng hạn, library/your_module.py.

Định nghĩa các tham số cho module của bạn. Ansible sẽ truyền các tham số này vào module để thực thi các tác vụ. Ví dụ:

#!/usr/bin/env python
from ansible.module_utils.basic import AnsibleModule

def main():
    module = AnsibleModule(
        argument_spec=dict(
            name=dict(type='str', required=True),
            age=dict(type='int', required=False, default=18),
            hobbies=dict(type='list', required=False, default=[]),
            is_married=dict(type='bool', required=False, default=False),
        ),
    )

Viết mã thực thi các tác vụ của module. Sau khi có các tham số, bạn có thể sử dụng chúng để thực thi các tác vụ cụ thể trong module. Ví dụ:

    name = module.params['name']
    age = module.params['age']
    hobbies = module.params['hobbies']
    is_married = module.params['is_married']

    if is_married:
        marital_status = "married"
    else:
        marital_status = "single"

    response = {
        "name": name,
        "age": age,
        "hobbies": hobbies,
        "marital_status": marital_status
    }

    module.exit_json(changed=False, meta=response)

Kiểm tra module của bạn để đảm bảo rằng nó hoạt động chính xác. Bạn có thể kiểm tra module bằng cách sử dụng lệnh ansible-docansible-playbook để thực thi module. Ví dụ:

$ ansible-doc -t module your_module
$ ansible localhost -m your_module -a "name=John hobbies=['reading', 'swimming'] is_married=True"

Tải lên module của bạn lên máy chủ Ansible và sử dụng trong các playbook của bạn. Bạn có thể đặt module của mình trong thư mục library của playbook hoặc trên một thư mục chung được chỉ định trong cấu hình của Ansible.

Dưới đây là một ví dụ về cách viết một module Ansible bằng Python để cài đặt phần mềm trên hệ thống Linux. Ví dụ này sẽ sử dụng Python để cài đặt các gói tmuxtree.

Tạo một thư mục tên là library trong thư mục playbook của bạn.

mkdir library

Tạo một file Python mới trong thư mục library. Chẳng hạn, install_package.py.

#!/usr/bin/python

from ansible.module_utils.basic import AnsibleModule

def install_package(name):
    try:
        rc, stdout, stderr = module.run_command('apt-get install -y ' + name)
    except Exception as e:
        return False, str(e)
    if rc != 0:
        return False, stderr
    return True, stdout

def main():
    module_args = dict(
        name=dict(type='str', required=True),
    )

    module = AnsibleModule(
        argument_spec=module_args,
        supports_check_mode=True
    )

    name = module.params['name']

    if module.check_mode:
        module.exit_json(changed=False)

    changed, output = install_package(name)

    module.exit_json(changed=changed, output=output)

if __name__ == '__main__':
    main()

Trong file này, chúng ta sử dụng module AnsibleModule để tạo một module Ansible. Chúng ta định nghĩa một hàm install_package để cài đặt gói bằng lệnh apt-get. Hàm này sẽ trả về kết quả là True nếu cài đặt thành công, hoặc là False nếu có lỗi xảy ra. Cuối cùng, chúng ta sử dụng module.exit_json để trả về kết quả cho Ansible.

Đặt quyền truy cập thực thi cho module của bạn.

chmod +x install_package.py

Tạo một playbook Ansible để sử dụng module của bạn. Trong playbook, bạn cần sử dụng module install_package để cài đặt phần mềm.

- name: Install packages
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Install tmux
      install_package:
        name: tmux
      register: result_tmux

    - name: Install tree
      install_package:
        name: tree
      register: result_tree

    - name: Show results
      debug:
        var: item
      loop:
        - "{{ result_tmux }}"
        - "{{ result_tree }}"

Trong playbook trên, Ansible sử dụng module install_package để cài đặt các gói tmuxtree. Ansible đăng ký kết quả trả về từ mỗi lệnh install_package vào các biến result_tmuxresult_tree. Cuối cùng, Ansible sử dụng module debug để hiển thị kết quả trả về.

3. Sử dụng Bash Script.

Ansible cũng hỗ trợ việc sử dụng Bash script như là một module để thực hiện các tác vụ trên các máy chủ hoặc thiết bị khác nhau. Dưới đây là các bước để viết một module Ansible bằng Bash script:

Tạo một script Bash để thực hiện các tác vụ cần thiết. Chẳng hạn, my_module.sh.

Trong script Bash của bạn, sử dụng các tham số được truyền từ Ansible để thực hiện các tác vụ cụ thể. Ansible sẽ truyền các tham số này vào module để thực thi các tác vụ. Ví dụ:

#!/bin/bash

NAME=$1
AGE=$2
HOBBIES=$3
IS_MARRIED=$4

if [ "$IS_MARRIED" = true ] ; then
  MARITAL_STATUS="married"
else
  MARITAL_STATUS="single"
fi

RESPONSE='{"name": "'"$NAME"'", "age": '"$AGE"', "hobbies": ["'"${HOBBIES//,/\",\"}"'"], "marital_status": "'"$MARITAL_STATUS"'"}'

echo "$RESPONSE"

Đặt quyền truy cập thực thi cho script của bạn.

$ chmod +x my_module.sh

Tạo một playbook Ansible để sử dụng module của bạn. Trong playbook, bạn cần sử dụng module command của Ansible và truyền script của bạn dưới dạng tham số.

- name: My playbook using Bash script module
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Execute my_module.sh
      command: ./my_module.sh John 25 reading,swimming true
      register: result

    - name: Show result
      debug:
        var: result.stdout | from_json

Trong playbook trên, Ansible sử dụng module command để thực thi script Bash của bạn và đăng ký kết quả trả về vào biến result. Sau đó, Ansible sử dụng module debug để hiển thị kết quả trả về.

Dưới đây là một ví dụ về cách viết một module Ansible bằng Bash shell để tạo một tập tin trên hệ thống Linux:

Tạo một script Bash để thực hiện tạo tập tin. Chẳng hạn, create_file.sh.

#!/bin/bash

FILE_PATH=$1

touch $FILE_PATH

echo "File created successfully"

Trong script này, chúng ta sử dụng lệnh touch để tạo một tập tin mới với đường dẫn được truyền vào như tham số. Sau đó, script sẽ in ra thông báo “File created successfully” để xác nhận rằng tập tin đã được tạo thành công.

Đặt quyền truy cập thực thi cho script của bạn.

chmod +x create_file.sh

Tạo một module Ansible để sử dụng script của bạn. Tên module nên được đặt theo quy tắc my_module, trong trường hợp này là create_file.

#!/bin/bash

FILE_PATH=$1

touch $FILE_PATH

echo '{"status": "success", "message": "File created successfully"}'

Trong script này, chúng ta sử dụng lệnh touch để tạo một tập tin mới với đường dẫn được truyền vào như tham số. Sau đó, script sẽ trả về một JSON với trạng thái “success” và thông báo “File created successfully”.

Đặt quyền truy cập thực thi cho module của bạn.

chmod +x create_file

Tạo một playbook Ansible để sử dụng module của bạn. Trong playbook, bạn cần sử dụng module my_module (tức là create_file trong trường hợp này) để tạo một tập tin mới.

- name: My playbook using Bash module
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Create new file
      my_module:
        path: /tmp/myfile.txt
      register: result

    - name: Show result
      debug:
        var: result

Trong playbook trên, Ansible sử dụng module my_module (tức là create_file trong trường hợp này) để tạo một tập tin mới và đăng ký kết quả trả về vào biến result. Sau đó, Ansible sử dụng module debug để hiển thị kết quả trả về.

Chúc bạn thành công khi viết module Ansible bằng Bash shell để tạo tập tin trên hệ thống Linux!

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories