Xem thêm về cách dùng Ansible tại đây: Giới thiệu Ansible
1. Role trong Ansible là gì?
Trong Ansible, role là một cơ chế cho phép chia nhỏ một playbook thành nhiều tập tin. Điều này giúp đơn giản hóa khi ta muốn viết một playbook phức tạp và giúp ta tái sử dụng chúng.
Một role chỉ nên giới hạn trong việc thực hiện một tác vụ trọn vẹn với đầy đủ những bước để hoàn tất nó. Ngoài ra, nó cũng có thể gọi đến những role mà nó phụ thuộc nếu cần.
Chẳng hạn, ta muốn tạo một playbook để cài đặt Tomcat 9 trong Ubuntu. Và Tomcat cần có Java để hoạt động. Trong trường hợp này, ta sẽ tạo hai role, một để cài đặt Java 11 và một để cài đặt Tomcat. Trong role Tomcat ta sẽ gọi đến role Java để cài Java trước khi cài Tomcat.
Role không phải là playbook. Role chỉ là những tác vụ nhỏ có thể được thực thi một cách độc lập bên trong một playbook. Ta không thể trực tiếp thực thi role, và nó cũng không trực tiếp cho biết nó sẽ được áp dụng vào host nào. Như vậy playbook sẽ gọi đến để thực thi các role và tập tin inventory sẽ xác định các host mà role sẽ thực thi trên đó.
2. Cấu trúc của một role
Thư mục chứa các tập tin của một role có cấu trúc được quy ước bởi Ansible. Các role được tạo bên trong thư mục có tên "roles" nằm cùng thư mục với tập tin playbook. Tên của một role là tên của thư mục chứa role đó.
Chẳng hạn ta có thể tạo một thư mục role có tên tomcat9 với lệnh sau :
$ ansible-galaxy init tomcat9 hoặc $ ansible-galaxy init --force --offline tomcat9
Role tomcat9 vừa phát sinh này có cấu trúc như sau :
$ tree tomcat9/
tomcat9/
├── README.md
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
Một role không nhất thiết phải có tất cả các thư mục như trên. Role đơn giản nhất chỉ cần có thư mục tasks. Tập tin main.yml trong thư mục này định nghĩa các tác vụ cho role.
Chú thích :
- tasks/main.yml : định nghĩa các tác vụ cho role thực thi
- handlers/main.yml : các handlers có thể được dùng bên trong hoặc bên ngoài role.
- defaults/main.yml : định nghĩa các biến mặc định dùng trong role. Các biến này có quyền ưu tiên thấp nhất và có thể được định nghĩa lại bên ngoài role.
- files/: chứa các tập tin mà role dùng trong việc thực thi nó.
- templates/: chứa các tập tin template dùng trong việc triển khai role. Các templates này có thể dùng cú pháp của Jinja2 để tham chiếu đến các biến định nghĩa trong ansible.
- meta/main.yml : định nghĩa những role mà role này phụ thuộc. Các role được định nghĩa ở đây sẽ được thực thi trước tiên, sau đó mới thực thi các tác vụ trong role hiện hành.
Một khi ta đã định nghĩa xong role tomcat9, ta sẽ tạo một playbook để thực thi role này như sau :
- name: Content of toan_ubuntu16
hosts: toan_ubuntu16
become: yes
roles:
- { role: ./roles/tomcat9 }
Dưới đây là một ví dụ cụ thể về việc dùng role với Ansible.
3. Cài đặt Tomcat 9 bằng Ansible
Việc cài đặt Tomcat 9 cần có java, python(2 hoặc 3), unzip cài đặt sẵn nên dưới đây ta cũng tạo các role này. Cụ thể cấu trúc các thư mục và tập tin cần tạo ta có như sau :
vagrant@ansible:~$ tree /vagrant/toan/
/vagrant/toan/
├── inventory-all-vms.yml
├── playbook-tomcat.yml
└── roles
├── open-jdk-11
│ └── tasks
│ └── main.yml
├── python
│ └── tasks
│ └── main.yml
├── python3
│ └── tasks
│ └── main.yml
├── tomcat9
│ ├── defaults
│ │ └── main.yml
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ └── tomcat9.service.j2
└── unzip
└── tasks
└── main.yml
15 directories, 11 files
Nội dung các tập tin trên như sau :
* Role open-jdk-11
open-jdk-11\tasks\main.yml :
---
- name: add openjdk repository
become: yes
apt_repository:
repo: ppa:openjdk-r/ppa
state: present
- name: install openjdk 11
become: yes
apt:
name: openjdk-11-jdk
state: present
- name: install openjre 11
become: yes
apt:
name: openjdk-11-jre
state: present
* Role python
python\tasks\main.yml :
- name: ensure python-dev is the latest version
become: yes
apt:
name: ["python", "python-pip", "python-setuptools", "python-dev", "python-dev", "build-essential", "libssl-dev", "libffi-dev", "libxml2-dev", "libxslt1-dev", "zlib1g-dev", "python-lxml"]
state: latest
force_apt_get: yes
* Role python3
python3\tasks\main.yml :
- name: ensure python3-dev is the latest version
become: yes
apt:
name: ["python3", "python3-pip", "python3-setuptools", "python-dev", "python3-dev", "build-essential", "libssl-dev", "libffi-dev", "libxml2-dev", "libxslt1-dev", "zlib1g-dev", "python3-lxml", "python3-pexpect"]
state: latest
force_apt_get: yes
* Role unzip
unzip\tasks\main.yml:
---
- name: install package
become: yes
apt:
name: unzip
state: present
* Role tomcat9
tomcat9\defaults\main.yml : tập tin này định nghĩa các biến dùng cho role tomcat9
tomcat9_service: "tomcat9"
tomcat9_server_root: "/etc/tomcat9"
tomcat9_conf_path: "/etc/tomcat9"
tomcat9_home: "/usr/share/tomcat9"
tomcat9_archive_url: "https://mirror.ibcp.fr/pub/apache/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz"
tomcat9_user: "tomcat9"
tomcat9_port: "8084"
tomcat9_group: "{{ tomcat9_user }}"
tomcat9_webapps_dir: "/usr/share/tomcat9/webapps/"
tomcat9_config_server_file: "/usr/share/tomcat9/conf/server.xml"
tomcat9_logs_dir: "/usr/share/tomcat9/logs"
tomcat9\handlers\main.yml :
---
- name: start tomcat9
become: yes
service:
name: "{{ tomcat9_service }}"
state: started
- name: restart tomcat9
become: yes
service:
name: "{{ tomcat9_service }}"
state: restarted
- name: stop tomcat9
become: yes
service:
name: "{{ tomcat9_service }}"
state: stopped
tomcat9\meta\main.yml :
---
dependencies:
- { role: open-jdk-11 }
Role tomcat9 phụ thuộc vào role open-jdk-11, do đó open-jdk-11 sẽ được cài đặt trước khi cài đặt tomcat 9
tomcat9\templates\tomcat9.service.j2
[Unit]
Description=Tomcat 9
After=syslog.target network.target
[Service]
Type=simple
User={{ tomcat9_user }}
Group={{ tomcat9_group }}
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
Environment='JAVA_OPTS=-Djava.awt.headless=true'
Environment=CATALINA_HOME=/usr/share/tomcat9
Environment=CATALINA_BASE=/usr/share/tomcat9
WorkingDirectory=/usr/share/tomcat9/bin
ExecStop=/bin/sh /usr/share/tomcat9/bin/catalina.sh stop
ExecStart=/bin/sh /usr/share/tomcat9/bin/catalina.sh run
UMask=0022
LogsDirectory=/usr/share/tomcat9/logs
LogsDirectoryMode=777
ReadWritePaths=/usr/share/tomcat9/webapps/
[Install]
WantedBy=multi-user.target
tomcat9\tasks\main.yml :
---
- name: add tomcat group
become: yes
group:
name: "{{ tomcat9_group }}"
- name: add tomcat user
become: yes
user:
name: "{{ tomcat9_user }}"
group: "{{ tomcat9_group }}"
home: "{{ tomcat9_home }}"
createhome: no
- name: Create a tomcat directory /usr/share/tomcat9
become: yes
file:
path: "{{ tomcat9_home }}"
state: directory
owner: "{{ tomcat9_user }}"
group: "{{ tomcat9_group }}"
- name: download and unarchive tomcat .tar.gz
become: yes
unarchive:
src: "{{ tomcat9_archive_url }}"
dest: "{{ tomcat9_home }}"
remote_src: yes
extra_opts: [--strip-components=1]
- name: Change ownership
become: yes
file:
path: "{{ tomcat9_home }}"
owner: "{{ tomcat9_user }}"
group: "{{ tomcat9_group }}"
mode: "u+rwx,g+rwx,o=rwx"
recurse: yes
state: directory
- name: Copy tomcat service file
become: yes
template:
src: templates/tomcat9.service.j2
dest: /etc/systemd/system/tomcat9.service
mode: 0644
- name: "configure server file {{ tomcat9_config_server_file }}"
xml:
path: "{{ tomcat9_config_server_file }}"
xpath: "/Server/Service[@name='Catalina']/Connector"
attribute: "port"
value: '{{ tomcat9_port }}'
- name: Create void catalina.out file and give permission
file:
path: /usr/share/tomcat9/logs/catalina.out
state: touch
mode: 0644
- name: Ensure logs are readable not only by tomcat9 user
become: yes
file:
path: "{{ tomcat9_logs_dir }}"
owner: root
group: root
state: directory
mode: a+xrw
recurse: yes
- name: Give permissions to work directory
file:
path: /usr/share/tomcat9/work
owner: root
group: root
mode: a+xrw
recurse: yes
- name: Give permissions to conf directory
file:
path: /usr/share/tomcat9/conf
owner: root
group: root
recurse: yes
- name: Create Catalina directory and give permission
file:
path: /usr/share/tomcat9/conf/Catalina
owner: "{{ tomcat9_user }}"
group: root
state: directory
mode: o+xrw
recurse: yes
- name: Give permissions to bin directory
file:
path: /usr/share/tomcat9/bin
owner: root
group: root
mode: a+xr
recurse: yes
- name: Give permissions to lib directory
file:
path: /usr/share/tomcat9/lib
owner: root
group: root
mode: a+xrw
recurse: yes
- name: Give permissions to webapps directory
file:
path: /usr/share/tomcat9/webapps
mode: a+xrw
recurse: yes
- name: Start and enable Tomcat service
systemd:
name: "{{ tomcat9_service }}"
state: started
enabled: yes
daemon_reload: yes
Tập tin trên định nghĩa quá trình cài đặt tomcat 9. Ở đây ta cài đặt Tomcat 9 trong Ubuntu 16.4 bằng cách tải gói tar.gz của nó về.
inventory-all-vms.yml
all:
children:
ubuntu_servers:
hosts:
jenkins_ubuntu18:
ansible_host: 10.0.0.11
toan_local:
hosts:
toan_ubuntu16:
ansible_host: 10.0.0.12
Trên đây là tập tin inventory định nghĩa các host
playbook-tomcat.yml
- name: Content of all VMs
hosts: all
become: yes
roles:
- { role: ./roles/unzip }
- { role: ./roles/python3 }
- { role: ./roles/python }
- name: Content of toan_ubuntu16
hosts: toan_ubuntu16
become: yes
roles:
- { role: ./roles/tomcat9 }
Trên đây là tập tin playbook, nó sẽ thực hiện các role unzip, python, python3 trên tất cả các host. Nó chỉ thực thi role tomcat9 trên host toan_ubuntu16.
* Thực thi playbook này như sau :
vagrant@ansible:~$ ansible-playbook /vagrant/toan/playbook-tomcat.yml -i /vagrant/toan/inventory-all-vms.yml
* Tập tin Vagrantfile định nghĩa các máy ảo như sau :
Vagrant.configure("2") do |config|
#common part of vms
BOX_IMAGE = "ubuntu/bionic64" # bionic 64 = ubuntu 18.04 64 bits
#ansible vm description
config.vm.define "ansible" do |ansible|
ansible.vm.box = BOX_IMAGE
ansible.vm.hostname = "ansible"
ansible.vm.network "private_network", ip: "10.0.0.10", virtualbox__intnet: true
ansible.vm.provision "shell", inline: "apt install python -yq", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get install -yq software-properties-common", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-add-repository -y ppa:ansible/ansible", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get update -yq", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get install -yq ansible", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end
#jenkins vm description
config.vm.define "jenkins" do |jenkins|
jenkins.vm.box = BOX_IMAGE
jenkins.vm.hostname = "jenkins"
jenkins.vm.network "private_network", ip: "10.0.0.11", virtualbox__intnet: true
jenkins.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end
config.vm.define "toan" do |toan|
toan.vm.box = "ubuntu/xenial64"
toan.vm.hostname = "toan"
toan.vm.network "private_network", ip: "10.0.0.12", virtualbox__intnet: true
toan.vm.network "forwarded_port", guest: 8084, host: 8084
toan.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end
end
Ở đây ta forward port của tomcat trong máy ảo là 8084 (định nghĩa trong lúc cài đặt tomcat ở trên) sang port 8084 của localhost. Sau khi thực hiện lệnh ansible-playbook như trên để cài đặt tomcat9, ta có thể kiểm tra tomcat có hoạt động hay chưa bằng URL sau :
http://localhost:8084/
Không có nhận xét nào:
Đăng nhận xét