Thứ Sáu, 24 tháng 9, 2021

Cài đặt và cấu hình Apache trên Ubuntu

Cài đặt Apache 

Ta cài đặt apache với lệnh sau

$ sudo apt-get install apache2

 

Trong bài này ta sẽ dùng methode PUT của HTTP do đó ta cần dùng đến WebDAV. Ta kích hoạt việc dùng module này trong Apache với lệnh sau :

$ sudo a2enmod dav
$ sudo a2enmod dav_fs

 

Cấu hình cho Apache 

Ta tạo tập tin toanhttp.conf tại /etc/apache2/sites-available

$ sudo vi /etc/apache2/sites-available/toanhttp.conf

 

Nội dung của tập tin toanhttp.conf như sau :

<VirtualHost *:9015>

        DocumentRoot /home/toan/toanhttp

<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted
DAV On
</Directory>

        <Directory /home/toan/toanhttp/ >
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                Allow from all
                Require all granted
        </Directory>

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
 

Cấu hình này cho phép mọi người truy cập bằng giao thức http vào mọi thông tin lưu tại /home/toan/toanhttp
Để ý thấy "DAV On" ở đây cho biết là ta kích hoạt sử dụng WebDAV

 

Thêm cổng 9015 vào tập tin ports.conf

$ sudo vi /etc/apache2/ports.conf

 

Thêm cổng này vào cuối tập tin ports.conf như sau :

Listen 9015

 

Thêm cấu hình toanhttp.conf vào Apache với lệnh sau và khởi động lại Apache để cập nhật cấu hình mới này như sau :

$ sudo a2ensite toanhttp.conf 
$ sudo service apache2 stop
$ sudo service apache2 start

 

Kiểm tra việc cài đặt Apache sau khi cấu hình cho nó

Trong một trình duyệt web, ta kiểm tra xem cấu hình này đã được Apache cập nhật chưa bằng cách truy cập địa chỉ URL sau :

http://localhost:9015/

 

Ta có thể xem các methode được cung cấp tại địa chỉ trên với cấu hình này của Apache bằng lệnh sau

$ curl -i -X OPTIONS "http://localhost:9015" 

Như đã thấy ở trên ta đã kích hoạt WebDAV trong Apache để sử dụng methode PUT, dưới đây là một truy vấn http PUT để tải lên tập tin có tên testhttp.txt vào thư mục gốc của site tức tại /home/toan/toanhttp với lệnh curl như sau :

$ curl -X PUT -T "testhttp.txt" "http://localhost:9015"

 

Cấu hình Apache với BASIC Authentication

Để phát sinh mật khẩu cho Apache ta cài đặt module sau :

$ sudo apt-get install apache2-utils

 

Sau đó tạo tập tin mật khẩu ".htpasswd" và thêm người dùng đầu tiên có tên "toanwebdav" với mật khẩu của nó với lệnh :

$ htpasswd -c /etc/apache2/.htpasswd toanwebdav
 

Để thêm người dùng tiếp theo có tên "toan" ta dùng lệnh sau : 

$ htpasswd /etc/apache2/.htpasswd toan
 

Ta tạo một tập tin cấu hình toanwebdav.conf cho Apache dùng BASIC Authentication như sau :

$ sudo vi /etc/apache2/sites-available/toanwebdav.conf

 

Nội dung của tập tin toanwebdav.conf

<VirtualHost *:9016>

        DocumentRoot /home/toan/toanwebdav

<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted
DAV On
AuthType Basic
AuthName "webdav - Authentication required"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>

        <Directory /home/toan/
toanwebdav/ >
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
        </Directory>

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

 

Tương tự như trên, ta sẽ :

Thêm cổng 9016 vào tập tin ports.conf

$ sudo vi /etc/apache2/ports.conf

Thêm cổng này vào cuối tập tin ports.conf như sau :

Listen 9016

 

Thêm cấu hình toanwebdav.conf vào Apache với lệnh sau và khởi động lại Apache để cập nhật cấu hình mới này như sau :

$ sudo a2ensite toanwebdav.conf 
$ sudo service apache2 stop
$ sudo service apache2 start

 

Trong một trình duyệt web, ta kiểm tra xem cấu hình này đã được Apache cập nhật chưa bằng cách truy cập địa chỉ URL sau :

http://localhost:9016/

Khi truy cập vào địa chỉ trên ta phải cung cấp tên người dùng (toanwebdav chẳng hạn) và mật khẩu mà ta vừa định nghĩa trong tập tin .htpasswd ở trên.

 

Cài đặt ftp trên Ubuntu

Cài đặt máy chủ ftp

 Ở đây ta cài đặt proftpd với lệnh sau

$ sudo apt-get install proftpd

 

Tạo một user trong Ubuntu

Ta có thể đăng nhập vào ftp bằng một người dùng Ubuntu 

Chẳng hạn, ta có thể tạo một user với lệnh sau :

$ sudo useradd -m toan

Lệnh trên sẽ tạo một user toan và tạo thư mục gốc của nó tại /home/toan 

 

Để thay đổi mật khẩu cho user ta có lệnh sau :

$ sudo passwd toan

 

Kiểm tra đăng nhập và tải tập tin với máy chủ ftp

Đến đây, ta có thể kiểm tra việc upload và download từ máy chủ ftp. Chẳng hạn ta tạo một tập tin test.txt tại thư mục gốc của user toan tức tại /home/toan Sau đó ta đăng nhập vào máy chủ ftp với lệnh sau

$ ftp -p <adress ip>

Nhớ thay thế <adresse ip> bằng địa chỉ ip của máy chủ ftp mà trên đó ta tạo một user toan. Sau khi đăng nhập với user toan, ta kiểm tra ftp với các lệnh sau :

ftp> get test.txt
ftp> put test.txt upload.txt
ftp> bye
Lệnh get sẽ tải tập tin test.txt từ /home/toan về máy. Lệnh put ở trên sẽ tải tập tin test.txt từ máy ta lên máy chủ ftp và đổi tên nó thành upload.txt 

Lệnh bye để đăng xuất khỏi máy chủ ftp.

 

 

Thứ Tư, 28 tháng 4, 2021

Ansible : Ví dụ về cấu hình hóa các biến

Khi viết các role cho ansible, nhiều khi ta muốn tạo biến để có thể tùy biến nội dung muốn thực hiện nhằm cho phép thêm/bớt nội dung cho việc thực hiện một vòng lặp. Dưới đây là một vài ví dụ :

Ví dụ 1

- name: dowload module jars to /tmp
get_url:
url: "{{ item }}"
dest: "/tmp/"
loop_control:
label: "download {{ item }} to /tmp/"
loop:
- "{{ download_jar_url }}/ojdbc8-12.2.0.1.jar"
- "{{ download_jar_url }}/logback-core-1.2.3.jar"
- "{{ download_jar_url }}/logback-classic-1.2.3.jar"
- "{{ download_jar_url }}/eclipselink-2.7.5.jar"

- name: add modules
become: yes
shell:
"{{ wildfly_bin_cli }} --connect command=\"module add --name={{ item.name }} --resource-delimiter=, --resources={{ item.resources }} --dependencies={{ item.dependencies }} \""
loop_control:
label: "add module {{ item.name }} with {{ item.resources }}"
loop:
- { name: "com.antonyudin.wildfly.security", resources: "/tmp/ay-securityrealm-ejb-1.0.jar", dependencies: "org.wildfly.security.elytron,org.wildfly.extension.elytron"}
- { name: "com.oracle", resources: "/tmp/ojdbc8-12.2.0.1.jar", dependencies: "javax.api,javax.transaction.api"}
- { name: "ch.qos.logback", resources: "/tmp/logback-classic-1.2.3.jar,/tmp/logback-core-1.2.3.jar", dependencies: "org.slf4j,javax.api,javax.transaction.api"}
- { name: "org.eclipse.persistence", resources: "/tmp/eclipselink-2.7.5.jar", dependencies: "asm.asm,javax.api,javax.annotation.api,javax.enterprise.api,javax.persistence.api,javax.transaction.api,javax.validation.api,javax.xml.bind.api,javax.ws.rs.api,org.antlr,org.apache.commons.collections,org.dom4j,org.jboss.as.jpa.spi,org.jboss.logging,org.jboss.vfs"}

 

Ta có thể định nghĩa lại biến cho vòng lặp trên như sau :

wildfly_bin_cli: /opt/wildfly/bin/jboss-cli.sh 
wildfly_modules_to_install:
- name: "ch.qos.logback"
resources:
- {jar_name: "logback-classic-1.2.3.jar", download_url: "{{ download_jar_url }}/logback-classic-1.2.3.jar"}
- {jar_name: "logback-core-1.2.3.jar", download_url: "{{ download_jar_url }}/logback-core-1.2.3.jar"}
dependencies: ["org.slf4j", "javax.api", "javax.transaction.api"]
- name: "com.oracle"
resources:
- { jar_name: "ojdbc8-12.2.0.1.jar", download_url: "{{ download_jar_url }}/ojdbc8-12.2.0.1.jar"}
dependencies: ["javax.api" , "javax.transaction.api"]
- name: "org.eclipse.persistence"
resources:
- {jar_name: "eclipselink-2.7.5.jar", download_url: "{{ download_jar_url }}/eclipselink-2.7.5.jar"}
dependencies: ["asm.asm", "javax.api", "javax.annotation.api", "javax.enterprise.api", "javax.persistence.api", "javax.transaction.api", "javax.validation.api", "javax.xml.bind.api", "javax.ws.rs.api,org.antlr", "org.apache.commons.collections", "org.dom4j", "org.jboss.as.jpa.spi", "org.jboss.logging", "org.jboss.vfs"]

 

Đoạn code để thực hiện trong vòng lặp trên sẽ được viết trong tập tin install_module.yml, và dưới đây là đoạn code để đưa biến vào vòng lặp

- name: install modules
include: install_module.yml
vars:
list_jar_module: "{{ module_item.resources | map(attribute='download_url') | list }}"
module_name: "{{ module_item.name }}"
module_path: "{{ module_item.name | replace('.', '/')}}"
list_resources: "{{ module_item.resources | map(attribute='jar_name') | list }}"
module_resources: "{{ ['/tmp/'] | product(list_resources) | map('join') | join(',') }}"
module_dependencies: "{{ module_item.dependencies | join(',') }}"
with_items: "{{ wildfly_modules_to_install }}"
loop_control:
loop_var: module_item

Nội dung của tập tin install_module.yml

- name: dowload {{ module_name }} module jars to /tmp
get_url:
url: "{{ item }}"
dest: "/tmp/"
loop_control:
label: "download {{ item }} to /tmp/"
loop: "{{ list_jar_module }}"


- name: "add module {{ module_name }} ; resources {{ module_resources }} ; dependencies {{ module_dependencies }}"
become: yes
shell:
"{{ wildfly_bin_cli }} --connect command=\"module add --name={{ module_name }} --resource-delimiter=, --resources={{ module_resources }} --dependencies={{ module_dependencies }} \""

Ví dụ 2

Định nghĩa biến :

wildfly_modules_base: "/opt/wildfly/modules/system/layers/base" 
wildfly_modules_to_configure:
- name: "org.slf4j"
xmlns: "urn:jboss:module:1.6"
resources: ["slf4j-api-1.7.22.jbossorg-1.jar"]
dependencies: ["ch.qos.logback"]
file_path: "{{ wildfly_modules_base }}/org/slf4j/main/module.xml"
- name: "org.jboss.logging"
xmlns: "urn:jboss:module:1.6"
resources: ["jboss-logging-3.4.1.Final.jar"]
dependencies: ["org.slf4j", "ch.qos.logback"]
file_path: "{{ wildfly_modules_base }}/org/jboss/logging/main/module.xml"

Gọi vòng lặp :

- name: update module.xml files
include: configure.yml
vars:
module_name: "{{ module_item.name }}"
module_xmlns: "{{ module_item.xmlns }}"
module_resources: "{{ module_item.resources }}"
module_dependencies: "{{ module_item.dependencies }}"
module_file_path: "{{ module_item.file_path }}"
with_items: "{{ wildfly_modules_to_configure }}"
loop_control:
loop_var: module_item

 

Nội dung tập tin configure.yml

- name: update {{ module_name }} module file {{ module_file_path }}
template:
src: "module.xml.j2"
dest: "{{ module_file_path }}"

 

Nội dung tập tin template module.xml.j2

<module name="{{ module_name }}" xmlns="{{ module_xmlns }}">
<resources>
{% for item in module_resources %}
<resource-root path="{{ item }}"/>
{% endfor %}
</resources>
<dependencies>
{% for item in module_dependencies %}
<module name="{{ item }}"/>
{% endfor %}
</dependencies>
</module>

 

Thứ Hai, 12 tháng 4, 2021

Git : Một số lệnh

 

Tải source về :

$ git clone <đường dẫn tới nguồn> 

 

Liệt kê các branch có trong kho (repository) trên máy đang làm việc

$ git branch


Lấy thông tin meta-data mới nhất từ original, kiểm tra xem có thông tin thay đổi gì mới hay không, và không sao chép những thay đổi này về.

$ git fetch


Chuyển sang branch khác. Chẳng hạn ta đang từ branch master, lệnh dưới đây sẽ chuyển sang branch dev

$ git checkout dev

Tạo một nhánh mới có tên toan

$ git checkout -b toan

Trong trường hợp tại nguồn ở xa đã có nhánh này nhưng trên máy đang làm việc ta không thấy nhánh này, ta cũng có thể tạo mới nhánh này ở trên máy. rồi sau đó thực hiện lệnh "git pull origin toan" để tải nhánh cùng tên từ xa về.


Tải về những thay đổi từ nhánh origin của branch có tên dev và cập nhật nó vào nhánh HEAD ở trên máy

$ git pull origin dev

Hiển thị trạng thái của thư mục hiện hành. Cho biết những thay đổi, và những tập tin mới chưa được thêm hay commit vào git.

$ git status


Lưu những thay đổi chưa được commit tại local, để có thể tiếp tục làm việc (như có thể commit, chuyển sang branch khác...), sau này có thể quay lại những thay đổi này khi sẵn sàng.
$ git stash

 

Thêm các tập tin mới tạo ở thư mục hiện hành vào index của Git trong local

$ git add .


Lưu những thay đổi vào repository local của Git

$ git commit

 

Chẳng hạn ta đang ở branch toan, lệnh sau sẽ gộp những thay đổi trong branch dev vào branch toan. Tức lệnh này sẽ cập nhật cho branch toan những thay đổi đến từ branch dev.

$ git merge dev

Đẩy những commit trong branch toan ở local vào branch toan ở xa (origin)

$ git push origin toan

 

Khi ta tạo branch toan tại local (chẳng hạn với lệnh "git checkout -b toan"), thì branch này chưa hiện hữu ở trong git ở xa. Ta có thể kiểm tra điều này với lệnh sau

$ git branch -vv


Vậy muốn đẩy branch toan này vào server git thì ta phải trước tiên tạo branch toan đó ở trên server git. Ta có thể thực hiện hai điều này cùng lúc tức tạo và đẩy branch toan này vào server git với lệnh sau :
$ git push --set-upstream origin toan


Cài đặt Docker trong Ubuntu 18.04

 Gói cài đặt Docker có sẵn trong kho(repository) chính thức của Ubuntu nhưng đó có thể không phải là phiên bản mới nhất. Để cài đặt phiên bản mới nhất của Docker, ta sẽ cài đặt nó từ kho chính thức của Docker. Để thực hiện điều này, ta sẽ thêm nguồn của package vào Ubuntu để nó biết tải Docker từ đâu, thêm khóa GPG từ Docker để đảm bảo Docker tải về là chính cống, rồi sau đó cài đặt gói này.

Nếu bạn ở hệ điều hành Windows và muốn dùng Docker trên Ubuntu, bạn có thể dùng Vagrant để tạo một máy ảo có hệ điều hành Ubuntu 18.04 chẳng hạn để cài Docker trên máy ảo này. Chi tiết dùng Vagrant tham khảo tại đây :

Cài đặt Vagrant trên Windows

 

Sau đây là các bước để cài đặt Docker trên Ubuntu :

Trước tiên, ta cập nhật danh sách các package:

$ sudo apt update 

 

Sau đó, cài đặt các package cần thiết để cho phép apt dùng package thông qua phương thức HTTPS :

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

 

Tiếp theo ta thêm khóa GPG của kho chính thức của Docker vào HĐH Ubuntu :

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Thêm kho Docker vào APT sources trong Ubuntu 18.04
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"


Sau đó, cập nhật lại danh sách các gói, ta sẽ thấy gói Docker từ repo vừa được thêm vào này:
$ sudo apt update


Nhớ xem kỹ là ta cài Docker từ kho chính thức của Docker chứ không phải từ kho của Ubuntu :

$ apt-cache policy docker-ce

Ta có thể thấy xuất hiện như sau (phiên bản Docker có thể khác ít nhiều)
  Installed: (none)
  Candidate: 18.03.1~ce~3-0~ubuntu
  Version table:
     18.03.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages

Giờ đây, ta có thể cài đặt Docker :
$ sudo apt install docker-ce

 

Sau khi cài đặt, kiểm tra xem Docker có đang hoạt động :

$ sudo systemctl status docker


Để thực thi các lệnh Docker mà không cần sudo
 

Mặc định, ta phải là người dùng root hoặc người dùng trong group docker khi thực thi các lệnh docker. Để tránh phải đánh sudo mỗi lần thực thi lệnh docker, ta thêm tên người dùng (ở đây là vagrant chẳng hạn) vào nhóm docker :

$ sudo usermod -aG docker vagrant

Để cập nhật thông tin vừa thêm vào nhóm
$ su - vagrant


Kiểm tra xem người dùng vagrant đã được thêm vào nhóm docker :
$ id -nG
Hiển thị :
vagrant docker

 

Một số lệnh docker

Tạo một image Docker tên toan từ Dockerfile ở thư mục hiện hành

$ sudo docker build -t toan .


Liệt kê các containers docker

$ docker ps -a

 

Liệt kê các image Docker

$ docker images

 

Xóa một image Docker

$ docker image rm -f <id của image Docker>


Thứ Năm, 21 tháng 1, 2021

Cài đặt Oracle 11g XE trong Ubuntu bằng Ansible

 Xem thêm về cách dùng role Ansible tại đây : Tạo và dùng Role với Ansible

Việc cài đặt Oracle 11g cần có python(2 hoặc 3), unzip cài đặt sẵn như khi ta cài Tomcat 9 ở bài trên. Dưới đây ta sẽ tạo một role có tên oracle-server cho phép ta cài đặt, cấu hình và tạo một cơ sở dữ liệu, rồi gỡ cài đặt này (uninstall) nếu muốn. Oracle ta sẽ cài là Oracle 11g XE, ta có thể tải gói này về từ trang chính thức của Oracle (phải login vào để tải về). Ở đây tôi dùng một đường dẫn có sẵn trên mạng để tải gói này về. Ta phải chuyển định dạng gói này từ .rpm sang .deb để có thể cài đặt nó trong Ubuntu.

Cấu trúc thư mục role oracle-server như sau :

vagrant@ansible:~$ tree /vagrant/toan/
/vagrant/toan/
├── inventory-all-vms.yml
├── playbook-oracle-server.yml
└── roles
├── oracle-server
│   ├── defaults
│   │   └── main.yml
│   ├── tasks
│   │   ├── main.yml
│   │   ├── oracle-toan-configure.yml
│   │   ├── oracle-ubuntu-install.yml
│   │   └── oracle-ubuntu-uninstall.yml
│   └── templates
│   ├── addToanTables.sql.j2
│   ├── chkconfig.j2
│   ├── configureSystemParameters.sql.j2
│   ├── createUserToan.sql.j2
│   ├── modifyPassword.sql.j2
│   ├── oracle-toan-configure.j2
│   └── oracle-xe-conf.j2
├── python
│   └── tasks
│   └── main.yml
├── python3
│   └── tasks
│   └── main.yml
└── unzip
└── tasks
└── main.yml

Nội dung của role oracle-server như sau :

oracle-server\defaults\main.yml : tập tin này định nghĩa các biến dùng cho role oracle-server

---
oracleserver_url: "http://download.xskernel.org/soft/linux-rpm/oracle-xe-11.2.0-1.0.x86_64.rpm.zip"
oracleserver_package: "oracle-xe-11.2.0-1.0.x86_64.rpm"

toan_user: toan
toan_password: toan
oracle_sys_password: syspwd
oracle_system_password: manager
config_file_path: /tmp/oracleToan

oracle_install: True
oracle_toan_configure: True
oracle_uninstall: False

oracle_http_port: 8081
oracle_listener_port: 1521
oracle_system_pwd: sysadmin
oracle_start_boot: y

* oracle-server\tasks

oracle-server\tasks\main.yml

- name : uninstall oracle
include_tasks: oracle-ubuntu-uninstall.yml
when: oracle_uninstall == True

- name : install oracle
include_tasks: oracle-ubuntu-install.yml
when: oracle_install == True

- name : configure oracle for toan
include_tasks: oracle-toan-configure.yml
when: oracle_toan_configure == True

Ansible sẽ đọc tập tin này và thực hiện tuần tự các tác vụ được định nghĩa trong đó. Ở đây, tùy vào giá trị của các biến oracle_uninstall, oracle_install và oracle_toan_configure là True hay False mà ansible sẽ thực hiện các tác vụ định nghĩa trong những tập tin tương ứng.

Giá trị mặc định của các biến này được định nghĩa là oracle_install: True; oracle_toan_configure: True . Vậy mặc định khi ta thực hiện lệnh ansible-playbook, ansible sẽ cài đặt oracle và tạo một CSDL như định nghĩa trong tập tin oracle-toan-configure.yml


oracle-server\tasks\oracle-ubuntu-install.yml

- name: install "yum", "libaio1", "bc", "alien"
become: yes
apt:
name: ["yum", "libaio1", "bc", "alien"]
state: latest
force_apt_get: yes

- name: download and unarchive {{ oracleserver_url }}
become: yes
unarchive:
src: "{{ oracleserver_url }}"
dest: "/tmp"
remote_src: yes

- name: Convert package {{ oracleserver_package }} to oracle-xe_11.2.0-2_amd64.deb
become: yes
shell: cd /tmp/Disk1 && alien --scripts --veryverbose {{ oracleserver_package }} >> /tmp/oracle-convert.log

- name: Copy work around /sbin/chkconfig file
become: yes
template:
src: templates/chkconfig.j2
dest: /sbin/chkconfig
mode: 0755

- name: Give permissions to oracle-xe_11.2.0-2_amd64.deb
become: yes
file:
path: "/tmp/Disk1/oracle-xe_11.2.0-2_amd64.deb"
mode: a+xrw

- name: install oracle-xe_11.2.0-2_amd64.deb
become: yes
apt:
deb: /tmp/Disk1/oracle-xe_11.2.0-2_amd64.deb

- name: Copy oracle config file
become: yes
template:
src: templates/oracle-xe-conf.j2
dest: /tmp/oracle-xe.conf
mode: 0755

- name: Test if execution of oracle_env.sh is already added in /etc/bash.bashrc
shell: grep -c "^/u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh" /etc/bash.bashrc || true
register: test_oracle_env

- name: add oracle environement variables by adding execution of oracle_env.sh in /etc/bash.bashrc
become: yes
lineinfile:
dest: /etc/bash.bashrc
line: ". /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh"
when: test_oracle_env.stdout == "0"

- name: Export oracle environnement variables by executing /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
become: yes
shell: . /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

- name: configure oracle-xe
become: yes
shell: /etc/init.d/oracle-xe configure < /tmp/oracle-xe.conf >> /tmp/oracle-xe.log

- name: Start Oracle-xe service
become: yes
shell: /etc/init.d/oracle-xe start

#- name: Add start oracle-xe service at boot
# become: yes
# shell: update-rc.d oracle-xe defaults

Tập tin này định nghĩa các bước để cài đặt Oracle 11g XE. Cụ thể là :
- Cài đặt những thư viện mà oracle cần dùng.
- Tải về gói rpm để cài oracle và giải nén nó.
- Chuyển gói rpm thành gói deb để có thể cài đặt nó trong Ubuntu.
- Tạo tập tin chkconfig nhằm cho phép cấu hình oracle khởi động khi boot và chép nó vào /sbin/chkconfig . Đây là cách hack để sử dụng lệnh "update-rc.d oracle-xe defaults" vì chkconfig không còn được dùng trong Ubuntu nữa mà quá trình cài đặt của gói oracle lại dùng đến chkconfig.
- Cài gói .deb vừa tạo
- Thực hiện lệnh "configure oracle-xe" để cấu hình oracle vừa cài đặt, nội dung thông tin cần trả lời cho quá trình cài đặt này được định nghĩa trong tập tin oracle-xe.conf
- Sau cùng là khởi động oracle một khi đã cài đặt xong.


oracle-server\tasks\oracle-toan-configure.yml : 

- name: Create {{ config_file_path }}
file:
path: "{{ config_file_path }}"
state: directory
mode: "u+rwx,g+rwx,o=rwx"
recurse: yes

- name: Copy oracle-toan-configure.sh file to {{ config_file_path }}
become: yes
template:
src: templates/oracle-toan-configure.j2
dest: "{{ config_file_path }}/oracle-toan-configure.sh"
mode: 0755

- name: Copy modifyPassword.sql file to {{ config_file_path }}
become: yes
template:
src: templates/modifyPassword.sql.j2
dest: "{{ config_file_path }}/modifyPassword.sql"
mode: 0755

- name: Copy createUserToan.sql file to {{ config_file_path }}
become: yes
template:
src: templates/createUserToan.sql.j2
dest: "{{ config_file_path }}/createUserToan.sql"
mode: 0755

- name: Copy configureSystemParameters.sql file to {{ config_file_path }}
become: yes
template:
src: templates/configureSystemParameters.sql.j2
dest: "{{ config_file_path }}/configureSystemParameters.sql"
mode: 0755

- name: Copy addToanTables.sql file to {{ config_file_path }}
become: yes
template:
src: templates/addToanTables.sql.j2
dest: "{{ config_file_path }}/addToanTables.sql"
mode: 0755

- name: update oracle user password
become: yes
user:
name: oracle
password: "{{ 'oracle' | password_hash('sha512') }}"

- name: configure oracle for toan
become: yes
become_user: oracle
shell: "{{ config_file_path }}/oracle-toan-configure.sh"
args:
chdir: "{{ config_file_path }}"

Tập tin này định nghĩa việc thực hiện việc cấu hình và tạo một CSDL cho user toan, nó sẽ gọi đến tập tin oracle-toan-configure.sh để thực thi các script sql trong thư mục templates.


oracle-server\tasks\oracle-ubuntu-uninstall.yml

- name: Stop Oracle-xe service
become: yes
service:
name: "oracle-xe"
state: stopped

- name: Create archive directory /dev/rmt0
file:
path: /dev/rmt0
state: directory
mode: "u+rwx,g+rwx,o=rwx"
recurse: yes

- name: Compress directory /u01/app/oracle into /dev/rmt0/oracle-bkup.tgz
archive:
path: /u01/app/oracle
dest: /dev/rmt0/oracle-bkup.tgz

- name: Remove oracle-xe package
become: yes
apt:
name: oracle-xe
state: absent
purge: yes

- name: Clean up /u01
become: yes
file:
path: /u01
state: absent

- name: Clean up /etc/oratab
become: yes
file:
path: /etc/oratab
state: absent

- name: Delete /etc/init.d/oracle-xe
become: yes
file:
path: /etc/init.d/oracle-xe
state: absent

- name: Delete /etc/default/oracle-xe
become: yes
file:
path: /etc/default/oracle-xe
state: absent

- name: Delete {{ config_file_path }}
become: yes
file:
path: "{{ config_file_path }}"
state: absent

- name: Remove the start of oracle-xe service at boot
become: yes
shell: update-rc.d -f oracle-xe remove

Tập tin này định nghĩa các bước để backup rồi xóa oracle (uninstall) 

 

* oracle-server\templates

Các script SQL để cấu hình CSDL cho user toan

oracle-server\templates\modifyPassword.sql.j2

set echo on
spool ./modifyPassword.log

alter profile default LIMIT PASSWORD_LIFE_TIME UNLIMITED;

alter user system identified by {{ oracle_system_password }};
alter user sys identified by {{ oracle_sys_password }};
commit;

spool off
exit 0

 

oracle-server\templates\configureSystemParameters.sql.j2

set echo on
spool ./configureSystemParameters.log

alter system set processes=1200 scope=spfile;
alter system set sessions=1822 scope=spfile;
alter system set transactions=3000 scope=spfile;
alter system set open_cursors=4000 scope=spfile;

spool off
exit 0

 

oracle-server\templates\createUserToan.sql.j2

set echo on
spool ./createUserToan.log

create user {{ toan_user }} identified by {{ toan_password }};
grant connect to {{ toan_user }};
grant resource to {{ toan_user }};
grant exp_full_database to {{ toan_user }};
grant imp_full_database to {{ toan_user }};
alter user {{ toan_user }} default tablespace TOAN_MDATA;
commit;

spool off
exit 0

oracle-server\templates\addToanTables.sql.j2

set echo on
spool ./addToanTables.log

drop table USER_LOGIN cascade constraints;

create table USER_LOGIN (
login varchar2(255) not null,
password varchar2(255),
primary key (login)
);

insert into USER_LOGIN (LOGIN, PASSWORD) values ('toan','test');

spool off
exit 0

Các tập tin lệnh bash và cấu hình

oracle-server\templates\oracle-xe-conf.j2

{{ oracle_http_port }}
{{ oracle_listener_port }}
{{ oracle_system_pwd }}
{{ oracle_system_pwd }}
{{ oracle_start_boot }}

Tập tin này được dùng trong lúc cấu hình oracle lần đầu tiên bằng lệnh "configure oracle-xe" như ta thấy ở trên.

 

oracle-server\templates\chkconfig.j2

#!/bin/bash
# Oracle 11gR2 XE installer chkconfig work around for Ubuntu

file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
cat >> $file <<-EOM
#
### BEGIN INIT INFO
# Provides: OracleXE
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Oracle 11g Express Edition
### END INIT INFO
EOM
fi

case "$1" in
--add)
echo "Add start oracle-xe service at boot"
update-rc.d oracle-xe defaults
;;
--del)
echo "Remove the start of oracle-xe service at boot"
update-rc.d -f oracle-xe remove
;;
esac
exit 0

Tập tin này cấu hình việc khởi động tự động oracle khi boot. Nó được chép vào /sbin/chkconfig và sẽ được gọi đến khi cài hoặc xóa oracle.


oracle-server\templates\oracle-toan-configure.j2

#!/bin/bash

. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

START_TIME=$SECONDS
echo BEGIN: `date "+%Y-%m-%d %H:%M:%S"`

sqlplus '/ as sysdba' @ {{ config_file_path }}/modifyPassword.sql
sqlplus system/{{ oracle_system_password }} @ {{ config_file_path }}/configureSystemParameters.sql

sqlplus '/ as sysdba' @ {{ config_file_path }}/createUserToan.sql
sqlplus {{ toan_user }}/{{ toan_password }} @ {{ config_file_path }}/addToanTables.sql

echo END: `date "+%Y-%m-%d %H:%M:%S"`
ELAPSED_TIME=$(($SECONDS - $START_TIME))
echo "DURATION=$ELAPSED_TIME seconds"
exit 0

Tập tin này định nghĩa việc thực thi các script sql để cấu hình và tạo một CSDL cho user toan.


* Các tập tin inventory và playbook

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-oracle-server.yml

- name: Content of all VMs
hosts: toan_ubuntu16
become: yes
roles:
- { role: ./roles/unzip }
- { role: ./roles/python3 }
- { role: ./roles/python }

- name: Content of all parkfolio servers
hosts: toan_ubuntu16
become: yes
roles:
- { role: ./roles/oracle-server }

Trên đây là tập tin playbook để thực hiện việc cài đặt/cấu hình/xóa oracle.

 

* 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.disksize.size = '10GB'
toan.vm.network "private_network", ip: "10.0.0.12", virtualbox__intnet: true
toan.vm.network "forwarded_port", guest: 8084, host: 8084
toan.vm.network "forwarded_port", guest: 1521, host: 1524
toan.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end

# Provider-specific configuration
config.vm.provider "virtualbox" do |v|
v.memory = "1024"
end

end

 

* Cài đặt Oracle 11g XE trong Ubuntu có thể tóm gọn vào các lệnh sau :

vagrant@toan:~$ sudo apt-get install unzip
vagrant@toan:~$ sudo apt-get install alien
vagrant@toan:~$ sudo apt-get install libaio1
vagrant@toan:~$ cd /tmp
vagrant@toan:/tmp$ wget http://download.xskernel.org/soft/linux-rpm/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
vagrant@toan:/tmp$ unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
vagrant@toan:/tmp$ cd /tmp/Disk1
vagrant@toan:/tmp/Disk1$ sudo alien --scripts --veryverbose oracle-xe-11.2.0-1.0.x86_64.rpm >> convert-oracle.log
vagrant@toan:/tmp/Disk1$ sudo cp /vagrant/toan/roles/oracle-server/templates/chkconfig.j2 /sbin/chkconfig
vagrant@toan:/tmp/Disk1$ sudo chmod 755 /sbin/chkconfig
vagrant@toan:/tmp/Disk1$ sudo dpkg --install ./oracle-xe_11.2.0-2_amd64.deb
vagrant@toan:~$ . /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
vagrant@toan:~$ sudo /etc/init.d/oracle-xe configure < /tmp/oracle-xe.conf >> /tmp/oracle-xe.log
vagrant@toan:~$ sudo /etc/init.d/oracle-xe start

* Xóa Oracle có thể tóm gọn như sau

$ sudo apt-get --remove oracle-xe
$ sudo apt-get --purge oracle-xe


Thứ Tư, 20 tháng 1, 2021

Tạo và dùng Role với Ansible - Cài đặt Tomcat 9 trong Ubuntu với Ansible

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/