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-doc
và ansible-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 tmux
và tree
.
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 tmux
và tree
. Ansible đăng ký kết quả trả về từ mỗi lệnh install_package
vào các biến result_tmux
và result_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!