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>