Thứ Hai, 28 tháng 4, 2014

XINETD trong linux

Xinetd là gì?

NAME

xinetd - the extended Internet services daemon  

Xinetd là một dịch vụ dùng để thay thế cho những internet service daemon cũ như inetd, tcp_wrappers...
Xinted cũng thực hiện các chức năng cơ bản tương tự như inetd : điều khiển các kết nối mạng đến hệ thống. File config của Xinetd sẽ quy đinh các service mà xnetd quản lý. Xinetd khởi chạy cùng với thời gian khởi chạy hệ thống và nằm yên cho tới khi có yêu cầu kết nối được gửi tới. Khi một request gửi tới một port được quản lý bởi Xinetd nó sẽ gửi request này tới server tương ứng mà nó quản lý, theo những quy định riêng của nó. 
Vì vậy, Chúng ta cóp thể goi xnetd như là một siêu máy chủ


Xined cung cấp một số tính năng nổi trội hơn như.
- Khả năng điều khiển truy cập
- Khả năng ngăn cản kiểu tấn công từ chối dịch vụ
- Khả năng log đa dạng hơn
- Khả năng giới hạn lượng process phục vụ dịch vụ.
- Khả năng tương tác người dùng.



Xinet hầu hết đã có sẵn trên những hệ điều hành Linux phổ biến và việc cài đặt nó khá đơn giản.
Download package dạng .tar.gz, giải nén và lần lượt chạy ./ config , make, make install.
Một số tuỳ chọn trong phần chạy ./config có thể bạn quan tâm.


--d : khởi chạy chế độ debug
--syslog: syslog_facility
log thông tin trong syslog 
--filelog: log to a file
--with-libwrap
Với tuỳ chọn này Xinetd sẽ kiểm tra các file cấu hình tcpd (/etc/hosts.allow, /etc/hosts.deny ) để xem yêu cầu kết nối có được phép thực hiện hay không, nếu không được phép Xinetd sẽ loại bỏ ngay các yêu cầu này, ngược lại nó sẽ thực hiện kết nối theo những quy định của nó.
--with-loadavg
Với tuỳ chọn này Xinetd sẽ sử dụng tuỳ chọn max_load trong những cấu hình của mình để deactive một số dịch vụ khi lâm vào tình trạng quá tải(có khả năng ngăn cản DOS).
--with-inet6
Hỗ trợ ipv6

File cấu hình chính /etc/xinetd.conf gồm hai phần chính "defaults section" và "services section"

defaults section
quy định những thuộc tính được áp dụng cho tất cả những dịch vụ chịu sự quản lý của Xinetd.
cấu trúc của nó dạng
defaults

{
attribute operator value(s)
...
}  services section
xác định những giá trị thuộc tính cho từng dịch vụ cụ thể, những dịch vụ  khai báo ở đây cũng phải được khai báo ở thuộc tính enabled ở phần defaults section.
Ở phần này có một số thuộc tính chung được sử dụng ở hầu hết các dịch vụ, nhưng cũng có những thuộc tính chí được sử dụng ở một số dịch vụ tuỳ vào đặc điểm của từng dịch vụ.

Cấu trúc của nó dạng

serviceservice_name

{

attribute operator value(s)

...

}

một số thuộc tính thường được sử dụng.
- instance
giới hạn số request lớn nhất được xử lý đồng thời hoặc số connection lớn nhất được phép kết nối. Thuộc tính này có khả năng chống kiểu tấn công từ chối dịch vụ.
- log_on_success
xác định những thông tin cần log lại khi có một kết nối được chấp nhận. Các giá trị có thể là HOST ( ghi lại địa chỉ ip của remote host), USERID (ghi lại id user đối với những dịch vụ yêu cầu xác thực user) EXIT (trạng thái kết thúc kết nối), DURATION ( thời gian kết nối) ...
- log_on_failure
xác định những thông tin cần được log lại đối với những kết nối không được chấp nhận ( do những quy định của file config ...) hoặc những kết nối không thể thực hiện được (do thiếu tài nguyên, lỗi hệ thống ...). Các giá trị có thể là HOST, USER ID, ATTEMPT ( những cố gắng tạo kết nối không thành ) RECORD (ghi tất cả những thông tin có thể ghi lại được của remote host).
- only_from
giới hạn những ip được phép thực hiện kết nối, giá trị mặc định là từ chối mọi kết nối (giống như giá trị mặc định của iptables) . Thông thường cấu hình là từ chối mọi kết nối tại phần defaults section là giới hạn ip được phép thực hiện kết nối tại phần services section đối với từng service cụ thể.
- per_source
xác định số lượng lớn nhất connection được phép thực hiện từ một địa chỉ ip, đâu cũng là một thuộc tính có khả năng chống tấn công từ chối dịch vụ.
- enabled
khai báo tất cả những dịch vụ được Xinetd quản lý tại đây.
sau đây là một số ví dụ cụ thể cho phần services section
service pop3s
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/ipop3d
only_from = 0.0.0.0/0 #allows every client
no_access = 207.35.78.10
instances = 30
log_on_success += USERID
log_on_failure += USERID
nice = -2
}

- service pop3s
xác định dịch vụ mà bạn muốn config, bạn lưu ý rằng tên này (pop3s) không được sử dụng tuỳ ý theo ý mình,tên này đã được quy định trong file /etc/services 
- socket_type
xác định loại socket sử dụng cho dịch vụ này, các giá trị có thể là stream, dgram, raw, rdm, seqpacket. Với dịch vụ pop3s bạn phải sử dụng socket loại stream.
- wait
xác định xem Xinet có tiếp tục nhận các request sau khi connection được thiết lập ( yes ) hay là được gửi trực tiếp cho dịch vụ đó ( no ).
- user
xác định địch vụ được chạy với tài khoản user nào (thường là tài khoản root).
- server
xác đinh chương trình (đường dẫn đầy đủ ) được Xinetd chạy đẻ thực hiện dịch vụ khi có request gửi đến socket.
- only_from
xác định những ip được phép thực hiện kết nối, 0.0.0.0/0 ở đây có nghĩa là mọi client đều có thể thực hiện kết nối.
- no_access
xác định những ip không được phép thực hiện kết nối, việc kết hợp hai thuộc tính only_from và no_access cho ta những giới hạn ip rất mềm dẻo.
- instance
xác định số lượng request lớn nhất mà dịch vụ có thể xử lý đồng thời, giá trị khai báo ở đây ghi đè lên giá trị đã khai báo ở phần defaults section đối với dịch vụ pop3s.
- nice
qui định độ ưu tiên process dịch vụ (phạm vi giá trị từ -20 đến 19), độ ưu tiên mặc định mà hệ thống qui định cho process pop3s là 10, với việc tăng độ ưu tiên giúp cho khả năng tạo kết nối nhanh hơn
# description: An RFC 868 time server. This is the tcp \
# version, which is used by rdate.
service time
{
socket_type = stream
wait = no
user = root
type = INTERNAL
id = time-stream
protocol = tcp
only_from = 207.35.78.0/24 192.168.1.0/24
no_access = 207.35.78.10
}
# description: An RFC 868 time server. This is the udp \
# version.
service time
{
socket_type = dgram
wait = yes
user = root
type = INTERNAL
id = time-dgram
protocol = udp
only_from = 207.35.78.0/24 192.168.1.0/24
no_access = 207.35.78.10
port = 37
}
với những tcp connection giá trị của socket_type phải là stream, udp connection giá trị của socket_type phải là dgram.
- type
xác định loại dịch vụ, các giá trị có thể là RPC ( dịch vụ thuộc loại remote procedure call ), INTERNAL (dịch vụ được cung cấp bởi Xinetd ) UNLISTED (những dịch không thuộc dạng dịch vụ hệ thống chuẩn )
- id
với Xinetd mặc định thì giá trị của thuộc tính này cũng giống như tên của dịch vụ, nhưng với một số dịch vụ có khả năng thực hiện kết nối ở nhiều protocol thì cần phải có những giá trị id khác nhau để phân biệt chúng.
- protocol
xác định loại protocol mà dịch vụ sử dụng.
- port
xác định port mà ở đó kết nối được thực hiện.
service imaps
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/imapd
only_from = 0.0.0.0/0 #allows every client
no_access = 207.35.78.10
instances = 30
log_on_success += DURATION USERID
log_on_failure += USERID
nice = -2
redirect = 192.168.1.14 993
bind = 207.35.78.3
}
- redirect
thuộc tính này cho phép dữ liệu nhận được của một dịch vụ TCP chạy trên một port xác định (993) được forward đến một host khác (192.168.1.14).
- bind
xác định địa chỉ ip mà tại đó dịch vụ sẵn sàng phục vụ.
với mục đích bảo vệ Xinetd bạn nên
- để file /etc/xinetd.conf chỉ có thể đọc được bởi root
chmod 400 /etc/xinetd.conf
- để đảm bảo file /etc/xinetd.conf không thể thay đổi được
chattr +i /etc/xinetd.conf

để chạy, dừng, hiển thị trạng thái Xinet bạn chỉ đơn giản thực hiện
/etc/init.d/Xinetd start|stop|status

[Nagios] NRPE

1. NRPE là gì?


NRPE là một phần bổ trợ cho phép bạn có thể thực thi các Nagios plugins trên nhiều remote Linux/ Unix machines. Mục đích chính của việc sử dụng NRPE là cho phép nagios có thể monitor các 'local' resources như CPU load, Memmory, .. trên các remote machines. Để làm được điều này, NRPE phải được cài đặt trên các remote machines

Có một điều bạn cần biết là có thể thực thi các Nagios plugion trên các remote machines dùng SSH. Có một check_by_ssh plugin cho phép bạn làm điều này. Tuy sử dụng SSH bảo mật hơn NRPE addon rất nhiều nhưng nó lại rất tốn CPU trên cả mornitoring và remote machines. Đây là một vấn đề lớn khi xây dụng một hệ thống monitor cho hàng trăm, hàng ngàn remote machines.

2. Mô hình hoạt động:
 

 NRPE addon bao gồm hai phần chính:
- Check_nrpe plugin, được thiết lập trên monitoring machine
- NRPE deamon, được install và setup trên các remote machines
 Quá trình monitor bao gồm các bước sau:
- Nagios sẽ thực hiện quá trình check_nrpe plugin, và báo cho check_nrpe biết các services nào cần được checks
- Check nrpe sẽ tạo một SSL connection với NPRE deamon
- NRPE deamon chạy các nagios plugin để thực hiện các checks trên remote machines
- Kết quả của các services check sẽ được NRPE deamon đưa về NAGIOS thông qua check_nrpe plugin trên monitor machine

Chú ý rằng , NRPE deamon yêu cầu Nagios plugins cần được install trên các remote machines

3. INSTALLATION
Đển sử dụng một NRPE addon, bạn cần thực hiện một số bước trên cả remote machines và monitoring machine

3.1: Một số yêu cầu:
- Được truy cập quyền root trên các machines
- Truy cập bằng nagios user account trên monitoring host

3.2. Setup trên remote hosts
Bạn cần install Nagios plugins và NRPE deamon
3.2.1 Tạo nagios account
3.2.2 install nagios plugins
3.2.3 Install NRPE deamon
3.2.4 install xinetd
3.2.5 open firewall ruller
Để chắc chắn trên các remote machine, local firewall cho phép NRPE deamon được truy cập từ các remote servers. Để làm điều này, có thể sử dụng lệnh iptable

iptables -I RH-Firewall-1-INPUT -p tcp -m tcp -dport 5666 -j ACCEPT

Save iptable rule bạn vừa tạo ra lại, và điều này sẽ làm machines reboots

Service iptable save

Tất cả các bước trên tham khảo tại
http://nagios.sourceforge.net/docs/nrpe/NRPE.pdf

3.3 setup mornitoring host
Trên mornitoring host cần làm những việc sau:
- Cài đặt check_nrpe
- Tạo ra một nagios command định nghĩa cho việc sử dụng chech_nrpe plugins
- Định nghĩa host và service check
Tham khảo tại:
http://nagios.sourceforge.net/docs/nrpe/NRPE.pdf







Chủ Nhật, 27 tháng 4, 2014

[Saltstack] Salt.states.file

states.file thực thi trên các regular files, special files, directories và các symlink( liên kết tượng trưng)

Một số function hay sử dụng:
1. Managed:
Được sử dụng khi tải một file từ satl master về minion
name: là tên file đó trong minion, nếu không có name thì tên file trùng tên ID
source: là đường dẫn file gốc trên master sẽ được tải về và đặt vào name
template: xác định template sử dụng, trong trường hợp file đó không chứa hardcode
2. Absent:
Xóa file có tên Name trên minion nếu file đó tồn tại
Nếu không có name, tên file cần xóa sẽ trùng tên ID
3. Directory:
Được sử dụng khi quản lý permisson của một directory hoặc file
makedir: True => tạo ra thư mục đó nếu nó không tồn tại
4. Append:
Thêm vào file tên name trong minion một đoạn text nếu trong đó không chưa có đoạn text đó. Đoạn text này sẽ được thêm vào cuối file đó
Có thể thêm một đoạn text, nhiều dòng hoặc đọc từ một file trên master
5. Missing:
Để kiểm tra file đó có tồn tại hay không, nếu không tồn tại sẽ return True, nhưng sẽ không xá file đó nếu nó tồn tại
6. pacth:
apply path cho một file
7 Rename:
salt.states.file.rename(name, source, force=False, makedirs=False)
 Đổi tên cho một file trên minion. File đó sẽ không được chèn lên nếu file đó đã tồn tại, trừ khi  thiết lập force = True




SQL

SQL là gì:
SQL là một ngôn ngữ chuẩn trong việc tạo, truy cập và thao tác với database

What is SQL?

  • SQL stands for Structured Query Language
  • SQL lets you access and manipulate databases
  • SQL is an ANSI (American National Standards Institute) standard

What Can SQL do?


  • SQL can execute queries against a database
  • SQL can retrieve data from a database
  • SQL can insert records in a database
  • SQL can update records in a database
  • SQL can delete records from a database
  • SQL can create new databases
  • SQL can create new tables in a database
  • SQL can create stored procedures in a database
  • SQL can create views in a database
  • SQL can set permissions on tables, procedures, and views


Cú pháp SQL:


Database tables:
Một database thường chứa nhiều bảng, mỗi bảngđượcđạidiện băng tên bảng, Trong một bảng có nhiều hàng và nhiều cột chứadữ liệu

SQL statements:
Tất cả các thao tác với SQL sử dụng các SQL statements.
ví dụ như khi bạn muốn list tất cả các dữ liệu trong một bảng:
select * from tablename

Chú ý, trong câu lệnh của SQL không phân biệt hoa thường, cuối mỗi câu lệnh ngăn cách với nhau bởi dấu ;

Some of The Most Important SQL Commands

  • SELECT - extracts data from a database
  • UPDATE - updates data in a database
  • DELETE - deletes data from a database
  • INSERT INTO - inserts new data into a database
  • CREATE DATABASE - creates a new database
  • ALTER DATABASE - modifies a database
  • CREATE TABLE - creates a new table
  • ALTER TABLE - modifies a table
  • DROP TABLE - deletes a table
  • CREATE INDEX - creates an index (search key)
  • DROP INDEX - deletes an index


Một số câu lệnh cơ bản của SQL:

Thiết lập một bảng dữ liệu tên username:
create table  username(id int(10), username varchar(100));

bảng này có hai cột:
id: kiểu dữ liệu là int,số lượng kí tự tối đa là 10
username : kiểu kí tự là vachar, số lượng kí tự tối đa là 100
Gồm có 20 kiểu dữ liệu trong SQL.

  • bigint: Dữ liệu kiểu số Nguyên (-2^63 đến 2^63-1)
  • int: Dữ liệu kiểu số Nguyên (-2^31 đến 2^31-1)
  • smallint: Dữ liệu kiểu số Nguyên (-2^15 đến 2^15-1)
  • tinyint: Dữ liệu kiểu số Nguyên (0 đến 255)
  • bit: Dữ liệu kiểu số Nguyên với 2 giá trị 0 & 1
  • decimal Fixed precision and scale numeric data from -10^38 +1 through 10^38 -1
  • numeric Fixed precision and scale numeric data from -10^38 +1 through 10^38 -1
  • money: Dữ liệu kiểu tiền tệ (-2^63 đến 2^63-1)
  • smallmoney: Monetary data values from -214,748.3648 through +214,748.3647
  • float Floating precision number data from -1.79E + 308 through 1.79E + 308
  • real Floating precision number data from -3.40E + 38 through 3.40E + 38
  • datetime Date and time data from January 1, 1753, through December 31, 9999, with an accuracy of 3.33 milliseconds
  • smalldatetime Date and time data from January 1, 1900, through June 6, 2079, with an accuracy of one minute
  • char Fixed-length character data with a maximum length of 8,000 characters
  • varchar Variable-length data with a maximum of 8,000 characters
  • text Variable-length data with a maximum length of 2^31 - 1 characters
  • nchar Fixed-length Unicode data with a maximum length of 4,000 characters
  • nvarchar Variable-length Unicode data with a maximum length of 4,000 characters
  • ntext Variable-length Unicode data with a maximum length of 2^30 - 1 characters
  • binary Fixed-length binary data with a maximum length of 8,000 bytes
  • varbinary Variable-length binary data with a maximum length of 8,000 bytes
  • image Variable-length binary data with a maximum length of 2^31 - 1 bytes
  • cursor A reference to a cursor
  • sql_variant A data type that stores values of various data types, except text, ntext, timestamp, and sql_variant
  • table A special data type used to store a result set for later processing
  • timestamp A database-wide unique number that gets updated every time a row gets updated ( uniqueidentifier A globally unique identifier)

SQL SELECT Statement

Được sử dụng để select data từ bảng dữ liệu
 Show bảng dữ liệu

Show cột username:
select username form username

dữ liệu được shown ra là một result table. được gọi là result-set

The SQL SELECT DISTINCT Statement

 Trong bảng dữ liệu, có thể chứa nhiều giá trị giống nhau,với lệnh này, bạn có thể đưa ra các dữ liệu riêng biệt nhau, nghĩa là nếu data2 mà trùng data1 thig kết quả chỉ shown data1, không show data2 nữa

SELECT DISTINCT column_name,column_name FROM table_name;



SQL WHERE Clause

SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

được sử dụng khi muốn đưa ra những dữ liệu chỉ thỏa mãn một điều kiện trang where
 ví dụ:
select * from user where username='thanhnt';

kết quả là những dòng có chứa user thanhnt

The SQL AND & OR Operators

Được sử dụng để lọc các dữ liệu với nhiều hơn một điều kiện
and: thỏa mãn tất cả các điều kiện
or: thỏa mã một trong số các điều kiện

Ví dụ:
Select * from user where username='thanhnt' and(or) 'id'=3


SQL ORDER BY Keyword

 Được sử dụng khi  muốn đưa ra một sort result-set mà các data trong cột đó được sắp xếp theo thứ tự abc

ví dụ:
select * from user order by user:

sqlite> select * from user order by username;
2|hungnv
1|thanhnt
3|thanhn
t



The SQL INSERT INTO Statement

 INSERT INTO table_name
VALUES (value1,value2,value3,...);

 Được sử dụng để thêm thông tin và bảng
sqlite> insert into user (username) values('hiepnv');
sqlite> select * from user ;
1|thanhnt
2|hungnv
3|thanhnt
|hiepnv



The SQL UPDATE Statement

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

Được sử dụng để update dữ liệu

sqlite> update user set username='thanhnguyen' where username='thanhnt';
sqlite> select * from user;
1|thanhnguyen
2|hungnv
3|thanhnguyen
|hiepnv



The SQL DELETE Statement

 Dùng để delete một hàng trong một bảng
DELETE FROM table_name
WHERE some_column=some_value;


sqlite> delete from user where username='hiepnv';
sqlite> select * from user;
1|thanhnguyen
2|hungnv
3|thanhnguyen


The SQL BETWEEN Operator

SELECT column_name(s) 

FROM table_name

WHERE column_name BETWEEN value1 AND value2;

được sử dụng khi muốn show các dòng ở giữa value1 và value2 trong cột column_name














Chủ Nhật, 20 tháng 4, 2014

20.4.2014

Bạn bè đi chơi, mình đi học và ở nhà học. Dù buồn nhưng cố gắng để cải thiện những tháng ngày đen tối này :v , không sao, cố lên tôi ơi

Thứ Năm, 17 tháng 4, 2014

INCLUDE VÀ EXCLUDE TRONG SALTSTACK

salt sls file có thể liên kết với nhiều sls files khác với include statement hoặc là  loại trừ đi những sls file cũng như là một thành phần ID... nào đó với exclude statement. Điều này cho phép một sls file có thể dễ dàng được mở rộng hoặc liên kết với các sls file khác một cách khá dễ dàng

1. INCLUDE- Liên kết các sls file


Khi các sls file đã được included, mọi thứ đã được định nghĩa trong included sls file sẽ được add đến state để chạy. Khi including định nghĩa một list các sls formulas bao gồm:

include:
  - http
  - libvirt


lệnh include trên sẽ include các sls formula http và libvirt. Các file này và sls file trên cùng được chứa trong cùng một environment( nơi mà chứa các sls file trong đó). Nhưng environment có thể được định nghĩa chính xác trong configuration, để ghi đè lên environment đang chạy nó. Trước đó, nếu một sls formula cần được included từ một environment mở rộng tên dev, sử dụng cú pháp:

include:
  - dev: http


2. EXCLUDE- loại trừ
lệnh exclude, cho phép một sls có thể loại trừ, không thực hiện một sls file hoặc một ID cụ thể nào đó.

Để exclude có thể remove đi một id hoặc một sls file, thì thành phần này( id, sls..) cần được định nghĩa trong exclude. Một lệnh exclude chạy highstate không chứa http sls và /etc/vimrc ID thì có cú pháo như sau:

exclude:
  - sls: https
  - id: /etc/vimrc


lệnh exclude được support từ bản salt 0.10.3

Thứ Tư, 16 tháng 4, 2014

Package lỗi authenticated trong quá trình download và install

Thỉnh thoảng khi bạn cài đặt một số package trên ubuntu bạn sẽ gặp phải những lỗi như thế này:

root@thanhnguyen:/home/thanhnguyen# sudo apt-get install git
Reading package lists... Done
Building dependency tree      
Reading state information... Done
The following extra packages will be installed:
  git-man liberror-perl
Suggested packages:
  git-daemon-run git-daemon-sysvinit git-doc git-el git-arch git-cvs git-svn
  git-email git-gui gitk gitweb
The following NEW packages will be installed:
  git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 90 not upgraded.
Need to get 5,963 kB/6,617 kB of archives.
After this operation, 15.2 MB of additional disk space will be used.
Do you want to continue [Y/n]?
WARNING: The following packages cannot be authenticated!
  liberror-perl git-man git
Install these packages without verification [y/N]?
E: Some packages could not be authenticated


=> lỗi:
E: Some packages could not be authenticated
nghĩa là trong quá trình download và cài đặt, có một số lỗi đã xảy ra khiến cho package git của bạn không được authenticated( lỗi chứng thực)

Để fix lỗi này, bạn cần làm những bước sau:
#  autoremove các gói phụ thuộc package git đã được download
sudo apt-get autoremove

# làm sạch( clean) APT's cache của package git đã được download\
# nhưng chưa thành công do xuất hiện lỗi trên
sudo apt-get cleandownload

# update lại APT database
sudo apt-get update

# install lại package git
sudo apt-get install -y -v git

Đó là tất cả những gì bạn phải làm :V

salt.states.cmd- thực thi command tùy ý

salt.states.cmd
cmd state module quản lý việc thực thi các lệnh được gọi. State này có thể gọi  lệnh chạy theo các trường hợp người dùng định sẵn:

Một ví dụ cơ bản trong việc  gọi thực thi một command:

date > /tmp/salt-run:
  cmd.run

Chỉ chạy khi các execution khác bị lỗi, trong trường hợp này sé ngắt hệ thống log nếu disk bị đầy:

> /var/log/messages:
  cmd.run:
    - unless: echo 'foo' > /tmp/.test

Chỉ chạy khi file được xác định với creates không tồn tại, trong trường hợp này sẽ tạo file /tmp/foo nếu nó không tồn tại:

touch /tmp/foo:
  cmd.run:
    - creates: /tmp/foo


Note that when executing a command or script, the state (i.e., changed or not) of the command is unknown to Salt's state system. Therefore, by default, the cmd state assumes that any command execution results in a changed state.

This means that if a cmd state is watched by another state then the state that's watching will always be executed due to the changed state in the cmd state.


Một số state cơ bản hay dùng:
1. salt.states.cmd.mod_watch(name, **kwargs)
Thực hiện một cmd function dựa trên một watch call
salt.states.cmd.run(name, onlyif=None, unless=None, creates=None, cwd=None, user=None, group=None, shell=None, env=None, stateful=False, umask=None, output_loglevel='info', quiet=False, timeout=None, **kwargs)

Chạy một command trong một trường hợp tùy ý, sử dụng cmd.wait nếu bạn muốn sử dụng 'watch' function

name:
thên của command. Hãy nhớ rằng đó là command sẽ được thực thi với đường dẫn cà permission của salt-minion

onlyif:
một command được chạy như một check, chạy command đó chỉ khi kết quả của command được thông qua trong function onlyif đó trả về là true

unless:
Một command chạy như một check, chạy command đó chỉ khi kết quả trả về khi chạy command trong unless function đó là false

cwd:
thư mục hiện tại để thực thi command  trong đó, default là root

user, group
username và group  chạy lệnh đó

shell
the shell để thục hiện command đó, default là /bin/sh

env
list các môi trường được thiết lập ưu tiên để thực hiện command đó

umask
The umask (in octal) to use when running the command :v

stateful
creates
chỉ chạy lênh đó nếu file được xác định bởi creates không tồn tại

2. salt.states.cmd.script(name, source=None, template=None, onlyif=None, unless=None, creates=None, cwd=None, user=None, group=None, shell=None, env=None, stateful=False, umask=None, timeout=None, **kwargs)

dowload script và thực thi nó với các tham số được xác định

source
nguồn để tải script đó về
template
template của file tải về
name
tên file, nơi đặt file được tải về
timeout
thiết lập thời gian tải script
creates
chỉ chạy lệnh tải script đó về khi file được xác định không tồn tại

3. salt.states.cmd.wait(name, onlyif=None, unless=None, creates=None, cwd=None, user=None, group=None, shell=None, env=(), stateful=False, umask=None, **kwargs)

Chạy lệnh chỉ khi statement trong watch thay đổi hoặc đã được thực hiện


4. salt.states.cmd.wait_call(name, func, args=(), kws=None, onlyif=None, unless=None, creates=None, stateful=False, **kwargs)

5. salt.states.cmd.wait_script(name, source=None, template=None, onlyif=None, unless=None, cwd=None, user=None, group=None, shell=None, env=None, stateful=False, umask=None, **kwargs)

chỉ tải script về khi statement được xác định bởi watch được thay đổi hoặc thực hiện

Thứ Ba, 15 tháng 4, 2014

Install ibus-unikey trên Ubuntu

Có rất nhiều phần mềm gõ tiếng việt trên ubuntu. Nhưng mình thấy dùng ibus-unikey là tiện lợi nhất vì nó supported trên ubuntu, tương thích với nhiều phần mềm và cài nó rất đơn giản :v

Install:
sudo apt-get install ibus-unikey

Kích hoạt bộ gõ:

Vào trình đơn System → Administration → Language Support (Hệ thống → Quản lý → Hỗ trợ ngôn ngữ), Ở phần Keyboard input method system (Hệ thống phương thức nhập) chọn ibus.

Bạn có thể kích hoạt bằng lệnh
im-switch -s ibus

Sau đó bạn đăng xuất khỏi máy tính và đăng nhập lại

Sau khi đăng nhập, bạn sẽ thấy biểu tượng ibus trên góc phải màn hình. Bạn kích vào đó, chọn References => input method => chọn Customize active input methods => select an input method => Vietnamese => unikey => Add và sau đó Close lại. Thế là xong

Bạn có thể tùy chọn tổ hợp phím để kích hoạt ibus-unikey. Default là ctrl + space

DISTUTILS - Tạo Package từ python module

Giới thiệu về DISTUTILS


Tài liệu này hướng dẫn bạn sử dụng Dstutils để distribute python module của bạn, rất cần thiết với các deverloper/ distributor: Nếu bạn tìm kiếm thông tin trong việc install một python module, bạn nên tham khảo về ' install python modules'
https://docs.python.org/2/install/index.html#install-index

Các khái niệm và thuật ngữ:

Là một developer, những điều bạn phải nắm được:
+ Viết một setup script
+ Viết một filg config
+ Tạo ra một source distribution( tạm hiểu là một nguồn tài nguyên có thể deploy và phát triển được)
+ Tạo ra một hoặc nhiều built distribution( đại loại là những distribution có khả năng xây dựng nên nhiều chương trình khác)

Tất cả các task trên đều được cover trong tài liệu này.

1.2. A Simple Example

The setup script là khá đơn giản, đc viết bằng python, không giới hạn những gì bạn có thể làm với nó. Tuy nhiên, bạn nên cẩn thận khi cung cấp nhứng thông tin quan trọng trong setup script. Setup script có thể chạy nhiều lần trong quá trình xây dựng và install module của bạn.

Nếu bạn muốn distribute với module tên là foo, được chứa trong file foo.py. Sau đó bạn thiết lập một script đơn giản như thế này:
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
Một vài điểm chú ý:
+ Hầu hết thông tin mà bạn cung cấp tới Distutil đều được nhập vào như là keyword arguments tới setup() function
+ Những keyword argument chia thành hai loaị: package metadata( tên, version..) và thông tin về package( trong trường hợp này là list các module)
+ Module được xác định bằng tên module, không phải là tên file( làm tương tự với các gói và phần mở rộng).
+ Bạn nên cung cấp thêm một số thông tin như tên, email, url....cho project này.

Để tạo ra một source distribute cho module này, bạn cần tạo một setup script, setup.py, và chạy lệnh:

python setup.py sdist

sdist sẽ tạo ra một file lưu trữ chứa setup script của bạn, và module foo.py của bạn. File lưu trữ này sẽ đucợ đặt tên là foo-1.0.tar.gz hoặc .zip và sẽ giải nén nó tới thư mục foo-1.0.
thanhnt@Thanhnt:~/pycode/ex_distutils/dist$ ls
foo-0.0.0.tar.gz  foo-1.0.tar.gz
Nếu một người muốn install module foo của bạn, việc phải làm là dowload file đó về , giải nén , tới thư mục foo-1.0 và chạy:

python setup.py install

việc này sẽ coppy foo.py tới thư mục thích hợp cho sự cài đặt của họ.
Ví dụ trên đã nêu nên một số vấn đề cơ bản của Distutils. Đầu tiên, cả developer và installer đều có một giao diện người dùng cơ bản như nhau. Chỉ khác command mà họ thực hiện:
 sdist cho deverloper
 install cho installer

Nếu bạn muốn tạo nên sự dễ dàng cho user của bạn, bạn có thể tạo nên nhiều buil distribute
Một số chú ý nhỏ:
python setup.py bdist_wininst
với bdist_wininst, bạn đã tạo ra file foo-1.0.win32.exe file trong thư mục hiện tại
python setup.py bdist_rpm
=> tạo file foo-1.0.noarch.rpm
bạn muốn biết thêm thông tin:
python setup.py bdist --help-formats

Thứ Hai, 14 tháng 4, 2014

Thực hiện các salt modules trong state

Execution of Salt modules from within states

State naỳ cho phép tạo ra các lời gọi module cá nhân thực hiện thông qua states. Để gọi một chức năng module duy nhất sử dụng module.run state:

mine.send:
  module.run:
    - func: network.interfaces


Đôi khi chúng ta muốn kích hoạt một function call( gọi một function) sau khi một state được thực hiện:
mine.send:
  module.wait:
    - func: network.interfaces
    - watch:
      - file: /etc/network/interfaces

ta sử dụng module.wait

Tất cả các tham số được thông qua tới module function sẽ được thực hiện. Tuy nhiên, do cách hoạt động của hệ thống các state, nếu một module function chấp nhận một tham số được gọi, name, sau đó là m_name phải được sử dụng để xác định tham số đó, để tránh xung đột với các tham số name. vi dụ:
disable_nfs:
  module.run:
    - name: service.disable
    - m_name: nfs

1. Salt.states.module.mod_watch(name, **kwargs)
Chạy một module function đơn
name:
tên module function thực hiện
Xác định return để gửi kết quả của sự thực thi module
**kwargs
Một số tham số cần thông qua kho thực thi module
2. Salt.states.module.run(name, **kwargs)Chạy một module function duy nh
name
Tên module function được chạy
returner:
Xác định returner để gửi kết quả của việc thực thi module
**kwargs
Một số tham số cần thông qua khi thực thi module
2. Salt.states.module.wait(name, **kwargs)
Chạy một module function duy nhất sau khi một state được thực hiện
name
Tên module function thực thi
**kwargs
Một số tham số cần thông qua khi thực thi module

 

CPU là gì?

CPU( Center Processing Unit), tạm dịch ra tiếng việt là ' Bộ xử lý trung tâm'
CPU có thể xem như là não bộ, một trong những bộ phận quan trọng nhất của máy tính. Nhiệm vụ chính của CPU là xử lý các chương trình và xử lý dữ liệu. CPU có nhiều hình dạng khác nhau. Đơn giản nhất là chỉ gồm một con chip với hàng chục chân, phức tạo hơn là bao gồm một mạch được cấu tạo từ N con chíp như vậy. CPU xử lý tín hiệu theo chương trình được thiết lập trước. CPU bao gồm CU-Control Unit ( khối điều khiển) và ALU-Arithmetic Logic Unit ( khối tính toán)

1. Khối Điều Khiển (CU - Control Unit)Có nhiệm vụ thông dịch các lệnh của chương trình và dieuf khiển hoạt động sử li, được điều khiển chính xác bởi xung nhịp đồng hồ hệ thống( là một mạch có nhiệm vụ đồng bộ các thao tác xử lý trong và ngoài CPU theo các khoảng thời gian không đổi. Khoảng thời gian chờ giữa hai xung gọi là chu kì xung nhịp. Tốc độ theo đó xung nhịp hệ thống tạo ra các xung tín hiệu chuẩn thời gian gọi là tốc độ xung nhịp – tốc độ đồng hồ tính bằng triệu đơn vị mỗi giây (Mhz).

2. Khối tính toán ALU (Arithmetic Logic Unit)
Chức năng thực hiện các phép toán số học và logic sau đó trả lại kết quả cho các thanh ghi hoặc bộ nhớ.

3. Các thanh ghi (Registers)
Là các bộ nhớ có dung lượng nhỏ nhưng tốc độ truy cập rất cao, nằm ngay trong CPU, dùng để lưu trữ tạm thời các dữ liệu , kết quả tính toán, địa chỉ các ô nhớ hoặc thông tin điều khiển. Mỗi thanh ghi có một chức năng cụ thể. Thanh ghi quan trọng nhất là bộ đếm chương trình (PC - Program Counter) chỉ đến lệnh sẽ thi hành tiếp theo.

4. Tốc độ
Tốc độ xử lý của máy tính chủ yếu phụ thuộc vào tốc độ của CPU, nhưng nó cũng phụ thuộc vào các phần khác như bộ nhớ RAM, bo mạch đồ họa, ổ cứng, v.v..
Có nhiều công nghệ làm tăng tốc độ xử lý của CPU. Ví dụ: pipeline, siêu phân luồng, v.v..
Có nhiều công nghệ làm tăng tốc độ xử lý của CPU. Ví dụ: pipeline, siêu phân luồng, v.v..

Tốc độ CPU có liên hệ với tần số đồng hồ làm việc của nó (tính bằng các đơn vị như MHz, GHz, v.v..). Đối với các CPU cùng loại, tần số này cao hơn cũng có nghĩa là tốc độ xử lý cao hơn. Đối với CPU khác loại, điều này chưa chắc đã đúng.
Ví dụ: CPU Intel Core 2 Duo có tần số 2,6 GHz có thể xử lí nhanh hơn CPU Intel Pentium 4 3,4 GHz.
Tốc độ CPU còn phụ thuộc vào bộ nhớ đệm - bộ nhớ dùng để lưu các lệnh/dữ liệu thường dùng hay có khả năng sẽ được dùng trong tương lai gần, giúp giảm bớt thời gian chờ đợi của CPU.
Ví dụ: Intel Core 2 Duo sử dụng chung cache L2 (shared cache) giúp cho tốc độ xử lý của hệ thống hai nhân mới này cao hơn so với hệ thống hai nhân thế hệ thứ nhất (Intel Pentium D) với mỗi nhân từng bộ nhớ đệm L2 riêng biệt.



Chủ Nhật, 13 tháng 4, 2014

Quản lý truy cập đến nhiều server với stormssh

Bài viết được thực hiện trên ubuntu 12.04.

Bạn đã từng đau đầu vì khi phải quản lý nhiều server mà không thể nhớ hết các thông tin về chúng?
Có một cách đơn giản là add thông tin của các server vào file ~/.ssh/config. Nhưng bạn lại ngại việc copy paste và sửa đổi mỗi lần thêm server hoặc thay đổi thông tin về server?

Stormssh là một giải pháp hữu hiệu dành cho người lười :D. Nó giúp bạn quản lý thông tin ssh của các server đơn giản và nhanh gọn chỉ với một câu lệnh ngắn.

Cơ bản, Stormssh lưu giữ thông tin các host tại ~/.ssh/config. Thay vì việc bạn phải add thông tin ssh của server bằng tay, thì stormssh add các thông tin đó thay bạn.

Storm is a command line tool to manage ssh connections


Cài đặt
$ [sudo] pip install stormssh 
$ [sudo] easy_install stormssh
hoặc:
$ git clone git://github.com/emre/storm.git
$ export PATH=$PATH:`pwd`/storm/storm/bin/; storm  

Update 28/05/2018: trên Mac OSX, có thể dùng brew để cài đặt:

```
$ brew install stormssh
```


Hướng dẫn dùng
$ storm --help
$ stom add --help

Tất cả các lệnh với storm
usage: storm [-h] COMMAND..
Command: 'version', 'add', 'edit', 'update', 'delete', 'list', 'search', 'delete_all', 'web'

Một số lệnh cơ bản với stormssh

connection_uri có dạng: ssh_user@host_IP:ssh_port

1. add host
$ storm add [-h]  [--id_file ID_FILE] name connection_uri
vd:$ storm add thanhnt root@x.x.x.x 

2. edit host
storm edit [-h] [--id_file ID_FILE] name connection_uri

3. delete host:
storm delete name
vd: $ storm delete thanhnt  

4. List host:
storm list

5. Delete all host
storm delete_all

6. Search host
storm search name
# list các host trong tên có bao gồm abc 
storm serch abc 

.....

để ssh vào một server được quản lý với storm, bạn gõ lệnh:

ssh hostname
vd: ssh thanhnt




Hướng dẫn cài đặt salt-vim

Salt-vim là một flugin cho Vim, có tác dụng hỗ trợ bạn khi bạn viết code, khiến code đơn giản và dễ viết hơn với Vim
Thực chất cũng chưa biết được hết những thứ mà salt-vim hỗ trợ, những thứ mình biết salt-vim có thể hỗ trợ khi viết code salt là:
+ Indent code
+ Hỗ trợ màu code, cái này rất có tác dụng khi debug
+ Auto complet: cái này theo mình hiểu thì là hỗ trợ nhớ code
Việc cài đặt salt-vim thực chất là bạn thêm một số config cho Vim hiện tạ bạn đang dùng

Bài này thực hiện theo tut:
https://github.com/saltstack/salt-vim

Các bước cài đặt:

Thứ Sáu, 11 tháng 4, 2014

[Saltstack] Remote execution tutorial


Chúng ta điều khiển các salt-minion từ salt với lệnh 'salt'. Lệnh này bao gồm ba thành phần chính:

$ salt 'target' <function> arguments

target ở đây chính là tên của minion mà bạn muỗn điều khiển

Một số options tham khảo tại
http://docs.saltstack.com/en/latest/ref/cli/salt.html

1.1 Target:
'Target' giúp bạn lọc ra những salt minion sẽ chaỵ những dòng lệnh tiếp theo. Theo mặc định, target là những minion id
Ví dụ:
# chạy lệnh test.ping tới tất cả các salt-minion do master này quản lý
salt '*' test.ping
#  chạy lệnh test.ping tới tất cả các salt-minion có tên bao gồm '.example.com' 
# do master này quản lý
salt '*.example.org' test.ping

 Targets có thể dựa trên thông tin hệ thống của minion bằng cách sử dụng Grains:

# Chạy lệnh test.ping với tất cả những minion sử dụng os ubuntu 
salt -G 'os:Ubuntu' test.ping

 Đọc thêm vè grains:
http://docs.saltstack.com/en/latest/topics/targeting/grains.html

Targets có thể được filter với những regular expression:
salt -E 'virtmach[0-9]' test.ping

Được xác định như là một list:

salt -L 'foo,bar,baz,quo' test.ping

Bao gồm nhiều kiểu targets trên cùng một lệnh:
salt -C 'G@os:Ubuntu and webser* or E@database.*' test.ping

1.2 Function
Một function là một số chức năng được cung cấp bởi một module. Salt có một bộ sưu tập rất nhiều các module

List tất cả các functions:
salt '*' sys.doc 
ví dụ:
show tất cả các minion do master hiện đang quản lý:
salt '*' test.ping
Chạy một lệnh trên minion:
salt '*' cmd.run 'uname -a'

1.3 Argument:
ví dụ:
salt '*' cmd.exec_code python 'import sys; print sys.version'
salt '*' pip.install salt timeout=5 upgrade=True
  
Thông thường , các keywords argument đều được hỗ trợ





Permissions on ubuntu

Permissions
Nhiều người có thể sử dụng một máy tính trong cùng một khoảng thời gian như nhau.

Vậy làm thế nào để bảo vệ quyền lợi của những user đó?
Đó là mục đích của bài học này

Bài học này bao gồm các lệnh:
+ chmod  thay đổi quyền truy cập  file
+ Su, sudo : tạm thời trở thành supperuser
+ chown: thay đổi quyền sở hữu tệp tin
+ chgrp: Thay đổi quyền sở hữu nhóm của tệp tin

File Permissions:

Trên hệ điều hành linux, mỗi tệp tin và thư mục đều được đăng kí quyền truy cập cho chủ sở hữu riêng của chúng, các thành viên của groupuser liên quan, và những người khác. Permissions có thể được chỉ định để đọc , viết, hay execute một file

Để hiểu về quyền setting một file, chúng ta có thể sử dụng lệnh ls
ví dụ:

[me@linuxbox me]$ ls -l /bin/bash
-rwxr-xr-x 1 root root  316848 Feb 27  2000 /bin/bash

+ file 'bin/bash' được sở hữu bởi user root
+ root user có quyền read, write , execute file này
+ file được sở hữu bởi nhóm root
+ members của nhóm root có thể r, x file này
+ mọi người khác có thể r, x file này

permissions diagram


Chmod:

Chmod command được sử dụng để thay đổi permission của một file hoặc directory. Để sử dụng nó, bạn  xác định các thiết lập mong muốn và tên file, các file mà bạn muốn thay đổi. Có hai cách để thực hiện điều này. Chúng ta chỉ bàn về cách có tên "octal notation method"

Đại diện cho ba thiết lập permissions ( owner, group, and other) là những con số, đây là cách khá thuận tiện cho việc nén lại các thiết lập permissions. Ví dụ , nếu bạn muốn thiếp lập "some_file" có quyền đọc và viết cho owner, nhưng lại muốn giữ file riêng đối với những người khác:

[me@linuxbox me]$ chmod 600 some_file

Bảng các con số đại diện :
http://linuxcommand.org/lc3_lts0090.php


Value Meaning
777 (rwxrwxrwx) No restrictions on permissions. Anybody may do anything. Generally not a desirable setting.
755 (rwxr-xr-x) The file's owner may read, write, and execute the file. All others may read and execute the file. This setting is common for programs that are used by all users.
700 (rwx------) The file's owner may read, write, and execute the file. Nobody else has any rights. This setting is useful for programs that only the owner may use and must be kept private from others.
666 (rw-rw-rw-) All users may read and write the file.
644 (rw-r--r--) The owner may read and write a file, while all others may only read the file. A common setting for data files that everybody may read, but only the owner may change.
600 (rw-------) The owner may read and write a file. All others have no rights. A common setting for data files that the owner wants to keep private.


Directory Permissions

chmod command có thể được sử dụng để điều khiển quyền truy cập cho các directories.
+ r: cho phép list nội dung thư mục
+ w: cho phép tạo, sửa delete file trong thư mục
+ x: Cho phép truy cập vào thư mục. Ví dụ như:
 cd dir


bảng các thiết lập cho directories:

Value Meaning
777 (rwxrwxrwx) No restrictions on permissions. Anybody may list files, create new files in the directory and delete files in the directory. Generally not a good setting.
755 (rwxr-xr-x) The directory owner has full access. All others may list the directory, but cannot create files nor delete them. This setting is common for directories that you wish to share with other users.
700 (rwx------) The directory owner has full access. Nobody else has any rights. This setting is useful for directories that only the owner may use and must be kept private from others.



Trở thành supperuser tạm thời:
Có những lúc bạn cần trở thành supperuser để thục hiện một sô tasks quản trị hệ thống quan trọng. Bạn sẽ cần phải được logged in như là một supper user.
Thực hiện điều này với câu lệnh:
$ su
$ sudo command...

và bạn cần nhập password

Thay đổi tệp tin sở hữu
bạn có thể thay đổi chủ sở hữu của một tệp tin bằng lệnh  chown.
Ví dụ bạn thay đổi chủ sở hữu của tệp tin some_file từ 'me' sang 'you':( bạn cần trở thảnh supperuser trước)

[me@linuxbox me]$ su
Password:
[root@linuxbox me]# chown you some_file
[root@linuxbox me]# exit
[me@linuxbox me]$


Thay đổi nhóm sở hữu:
dùng lệnh "chgrp"
ví dụ:

[me@linuxbox me]$ chgrp new_group some_file

để chuyển quyền nhóm sở hữu của some_file thành new_group

Thứ Năm, 3 tháng 4, 2014

socket

Lên mạng tìm được bài này nói về socket khá dễ hiểu, lưu lại chút

Các máy tính giao tiếp và nhận diện nhau thông qua địa chỉ ip

Khi biết địa chỉ IP ta có thể xác định được chiếu máy tính duy nhất đó ở trong mạng. Tuy nhiên trong trường hợp chiếc máy tính đó chạy nhiều chương trình cùng một lúc thì các máy tính khác nhận diện và truy cập chương trình đó như thế nào?
Các chương trình đó được phân biệt với nhau bởi khái niệm port

Ví dụ: trên máy A chạy Web server và DNS server . Các máy khác khi muốn kết nối với máy A thì cần tìm đến địa chỉ IP của nó. Nhưng để phân biệt được sử dụng WEB hay DNs thì cần thêm port vào sau địa chỉ IP

Giả sử có máy B truy cập vào dịch vụ web của máy A có IP là 10.2.23.2 thì trong gói tin IP gửi đi có chứa IP đích là IP máy A và port đích là 80
nghĩa là gói tin IP gửi đi có dạng là 10.2.23.2:8080

Cùng lúc đó có máy C truy cập đến dịch vụ DNS của máy A thì trong gói tin IP gửi đi sẽ bao gồm IP đích là 10.2.23.2 và port 53

Socket = IP + port

Vậy socket được dùng để xác định một dịch vụ cụ thể khi truy cập vào server

vô đề

LÀM THẾ NÀO ĐỂ KHÔNG TRỞ THÀNH MỘT NGƯỜI THỪA.....
ĐÓ LÀ MỘT CÂU HỎI LỚN ................. MÀ CÂU TRẢ LỜI AI CŨNG BIẾT NHƯNG KHÔN PHẢI DỄ DÀNG LÀM ĐƯỢC NÓ :(

Thứ Tư, 2 tháng 4, 2014

Salt formula

Tự nhận thấy Salt là một chương trình quản lý cực kì tuyệt vời
Nó tuyệt ở chỗ bạn muỗn deploy một softwer nào đó trên một server  chỉ với hai ba dòng lệnh là ok, vậy mà một thằng 'lính mới' như mình lại mất cả vài tuần cũng chưa chắc đã hoàn thiện được như thế

Và tớ cũng muốn mình có thể tạo được những "chương trình" như thế, và người ta gọi đó là salt- formula
Thực sự hiện tại thấy để viết được một salt formula mình thấy rất là khó, nhưng khó không có nghĩa là không làm được. Hiện tại mới nhận ra mình cần làm những bước như thế này, trong quá trình làm nếu có gì không đúng sẽ sửa đổi dần dần
1. Đọc kĩ tut salt formula trong saltstack tutorial
2. Học jinja2
3. Đọc về Uwsgi
4. Đọc về nginx
5. Viết salt formula

Và những cái trên với mình có lẽ là ...mới. Cố gắng nào

Ở trên là những kiến thức cần học để viết lên một salt formula
Mình quên mất một điều quan trọng là một formula chỉ được viết khi đã cài đặt một softwer băng tay thành công

Trong ví dụ viết salt formula deploy gladius, cần thực hiện 3 bước:
1. Dùng salt formula cài uwsgi
2. Cấu hình cho gladius chạy bằng uwsgi và nginx
3. Viết salt formula sau khi đã cài đặt xong

Hiện tại thì mới hiểu được bước 1

Bước 1: Cài uwsgi: xong
uWsgi là cái khỉ gì?

WSGI is the Web Server Gateway Interface. It is a specification that describes how web server communicates with web applications, and how web applications can be chained together to process one request.

WSGI là  Web server Gateway Interface , Một Specification ( chỉ dẫn kỹ thuật) mô tả cái cách mà web server giao tiếp với các web app, và cái cách mà các web app kết hợp với nhau để xử lý một yêu cầu

The uWSGI project aims at developing a full stack for building hosting services.

Application servers (for various programming languages and protocols), proxies, process managers and monitors are all implemented using a common api and a common configuration style.

uWSGI project nhằm phát triển đầy đủ các thành phần cho quá trình xây dựng nên các hosting services ( các dịch vụ lưu trữ)

Các appliction servers( các server ứng dụng )  (cho cả các ngôn ngữ lập trình và các protocol khác ) , prixies , quản lý các quá trình cũng như các monitors đều được thực hiện với một api chung và một style configuration chung


Included components (updated to latest stable release)

The Core (implements configuration, processes management, sockets creation, monitoring, logging, shared memory areas, ipc, cluster membership and the uWSGI Subscription Server)

Request plugins (implement application server interfaces for various languages and platforms: WSGI, PSGI, Rack, Lua WSAPI, CGI, PHP, Go ...)















Install sublime 3 on ubuntu 12.04

Tớ chưa được dùng nhiều các loại text editor trên ubuntu nhưng theo tớ thấy thì sublime 3 quả là một text editor có khả năng gây nghiện. Chỉ có một hạn chế "nho nhỏ" là không gõ được tiếng việt :)) => có nhiều hạn chế khi viết html, ít ra là tớ thấy vậy
Các bước cài đặt sublime 3:
1. Add the ppa repository
sudo add-apt-repository ppa:webupd8team/sublime-text-3 
2. Update
sudo apt-get update 
3. Install sublime 3:
sudo apt-get install sublime-text-installer

Done :v