반응형

Concept

  • Control node: Ansible을 실행하는 Node
  • Managed node: Ansible 관리 대상이 되는 Node

 

Installation

$ sudo yum install epel-release
$ sudo yum install ansible

## Adding Ansible command shell completion
##  -> 이것은 편의를 위한 기능이니, 꼭 설치할 필요는 없다
$ sudo yum install python-argcomplete
$ sudo activate-global-python-argcomplete

## Let's check the version
$  ansible --version
ansible 2.9.25
...

## host inventroy file을 편집
$ cat /etc/ansible/hosts
...
[kubeworker]
10.10.12.64
10.10.12.71

[mynode]
10.10.12.64
...
$

##
## TEST for installation
##

$ ansible all --list-hosts
  hosts (2):
    10.10.12.64
    10.10.12.71
    
$ ansible all -m ping
10.10.12.64 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
10.10.12.71 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.10.12.71 port 22: No route to host",
    "unreachable": true
}
$

 

Run example playbook - 1

##
## Run this playbook on control node
##

$  cat  playbook-example.yaml
---
- name: Add_sample_contents_to_file
  hosts: mynode

  tasks:
  - name: Add sample contents to file
    blockinfile:
      path: /root/sample_a.txt
      block: |
        [my test section]
        best contents
        greeting=hello       
$
$  ansible-playbook playbook-example.yaml

PLAY [Add_sample_file] ************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************
ok: [10.10.12.64]

TASK [Add sample file] ************************************************************************************************************
changed: [10.10.12.64]

PLAY RECAP ************************************************************************************************************************
10.10.12.64                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$

##
## Check result of test on managed node(10.10.12.64)
##

$  cat  /root/sample_a.txt
# BEGIN ANSIBLE MANAGED BLOCK
[my test section]
best contents
greeting=hello
# END ANSIBLE MANAGED BLOCK
$

 

Run example playbook - 2

##
## Run this playbook on control node
##

$  cat  playbook-example-2.yaml
---
- name: Install pkg and create a file
  hosts: mynode

  tasks:
  - name: Install kubernetes pkg
    yum: name=tree state=present
    when: ansible_distribution == 'CentOS'
  - name: Run my command
    command: "touch /root/mydate.txt"
    when: ansible_distribution == 'CentOS'     
$
$  ansible-playbook playbook-example-2.yaml
...
$

##
## Check result of test on managed node(10.10.12.64)
##

$  which tree
/usr/bin/tree

$  ls /root/mydate.txt
/root/mydate.txt

 

Tip:   특정 User로 Ansible 실행

managed node에서 특정 user(예: root)로 실행되길 원한다면, 아래와 같이 설정 파일을 작성한다.

$  cat  /etc/ansible/ansible.cfg
...

[privilege_escalation]
become=True
become_method=sudo
become_user=root        ## Root user로 명령을 수행한다.
become_ask_pass=False   ## password를 묻지 않고 명령을 수행한다.

...

$

 

 

 

Reference

https://young-dev.com/infra/ansible_02/#

 

[Ansible] Ansible-Playbook 사용하기 #2

Ansible-Playbook 활용

young-dev.com

 

 

 

 

'CentOS' 카테고리의 다른 글

CPU Pinning 예제 코드  (0) 2022.06.17
Install Ansible AWX (version 17.1.0)  (0) 2021.11.16
Install OS with PXE and kickstart  (0) 2021.11.12
Samba(SMB) on CentOS  (0) 2021.07.10
Network config on CentOS 8  (0) 2021.07.10
반응형

 

 

사람의 개입을 최소화하면서 OS를 자동 설치하는 절차를 설명하겠다.

OS를 자동 설치하는 큰 흐름은 아래 그림과 같다.

 

 

 

OS 자동 설치 절차 개요

 

DHCP, TFTP를 이용한 PXE Booting 절차

 

 

 

PXE 개념

 

PXE(Preboot Execution Environment)는 Network를 통해 OS Booting에 필요한 정보를 전달하기 위한 기술이다.

 

 

PXE를 동작시키기 위한 구성 요소

  • Server 구성 요소
    • DHCPD: DHCP Server 역할을 수행.  Client Node에게 설정해줘야할 Network 구성 정보를 전달해준다.
    • TFTP: Client의 PXE Boot image를 배포한다.
    • FTP: PXE booting 이후, OS Image 및 SW PKG를 설치할 때 필요한 File을 배포한다.
    • Kickstart: Client가 OS를 설치할 때, Kickstart 설정 파일을 읽어서 OS 설치 작업을 자동화한다. (Network 설정, 특정 PKG 설치 여부 결정, Account 생성, 인증서 복사 등)
  • Client 구성 요소
    • BIOS/NIC: BIOS에서 PXE boot를 지원해야 한다.

 

 

 

준비 작업 (Server Software PKG 설치 + 설정 파일 작성)

 

Server PKG 설치

$ yum install -y  dhcpd tftp ttfp-server xinetd vsftpd syslinux
$ systemctl enable --now dhcpd
$ systemctl enable --now tftp
$ systemctl enable --now xinetd
$ systemctl enable --now vsftpd

 

 

DHCPD Server 설정

$  cat /etc/dhcp/dhcpd.conf

...

allow booting;
allow bootp;
allow unknown-clients;

subnet 10.10.12.0 netmask 255.255.255.0 {
  range           10.10.12.64 10.10.12.79;
  option routers  10.10.12.1;
  option broadcast-address 10.10.12.255;
  option subnet-mask 255.255.255.0;
  option domain-name-servers 10.10.100.2;
  get-lease-hostnames true;
  next-server     10.10.12.33;              ## NOTE: TFTP Server 주소를 설정
  filename        "pxelinux.0";             ## NOTE: Boot Image 정보를 설정
}

...

 

 

TFTP Server 설정

$  cat  /etc/xinetd.d/tftp

service tftp
{
	socket_type		= dgram
	protocol		= udp
	wait			= yes
	user			= root
	server			= /usr/sbin/in.tftpd
	server_args		= -s /var/lib/tftpboot   ## NOTE: boot image file을 저장할 directory
	disable			= no                     ## NOTE: 'no'로 변경
	per_source		= 11
	cps			= 100 2
	flags			= IPv4
}

 

 

FTP Server 설정

## 모든 client가 vsftpd에 access하는 것을 허용하기 위한 설정
## (ID, Password 없이 FTP server에 access하는 것이 가능)

$  setsebool -P allow_ftpd_full_access 1

 

 

syslinux file 복사

##  Client에게 전달할 syslinux boot loader 파일을 TFTP 서버 폴더에 복사한다.

$  cp /usr/share/syslinux/pxelinux.0  /var/lib/tftpboot
$  cp /usr/share/syslinux/menu.c32    /var/lib/tftpboot
$  cp /usr/share/syslinux/memdisk     /var/lib/tftpboot
$  cp /usr/share/syslinux/mboot.c32   /var/lib/tftpboot
$  cp /usr/share/syslinux/chain.c32   /var/lib/tftpboot

 

 

PXE Menufile 작성

 

##  TFTP 서버의 /var/lib/tftpboot/pxelinux.cfg/default 파일에 아래와 같은 내용을 작성한다.

$  cat  /var/lib/tftpboot/pxelinux.cfg/default

default menu.c32
prompt 0
timeout 30

menu title Homelab PXE Menu

label centos7_x64
  menu label CentOS 7_X64
  kernel /networkboot/centos/vmlinuz
  append initrd=/networkboot/centos/initrd.img inst.repo=ftp://10.10.12.33/pub/centos ks=ftp://10.10.12.33/pub/centos/centos7.cfg

 

 

Linux OS image file 준비

##  FTP server에 Linux OS image file을 복사하는 절차

$  mkdir  /media/iso
$  mount  /myhome/CentOS-7-x86_64-2009.iso  /media/iso
$  mkdir  -p  /var/ftp/pub/centos
$  cp -r  /media/iso/*  /var/ftp/pub/centos/
##  준비 작업을 마무리했다면, FTP 서버에 접근 가능한지 아래와 같이 확인한다.
##  (가능하면 Remote Node에서 테스트할 것)

$  curl ftp://x-node.hub.cncf/pub/centos/
-rw-r--r--    1 0        0              14 Oct 29  2020 CentOS_BuildTag
drwxr-xr-x    3 0        0              35 Oct 26  2020 EFI
-rw-rw-r--    1 0        0             227 Aug 30  2017 EULA
-rw-rw-r--    1 0        0           18009 Dec 09  2015 GPL
drwxr-xr-x    2 0        0              43 Oct 26  2020 LiveOS
drwxr-xr-x    2 0        0          225280 Nov 04  2020 Packages
-rw-rw-r--    1 0        0            1690 Dec 09  2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r--    1 0        0            1690 Dec 09  2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--    1 0        0            2883 Nov 04  2020 TRANS.TBL
-rwxr-xr-x    1 0        0            1833 Nov 09 10:16 centos7-graphical-server.cfg
-rwxr-xr-x    1 0        0            1708 Nov 10 14:37 centos7-ok-11-10.cfg
-rwxr-xr-x    1 0        0            5462 Nov 11 10:16 centos7-ok-11-11-2nd.cfg
-rwxr-xr-x    1 0        0            3381 Nov 11 01:39 centos7-ok-11-11.cfg
-rwxr-xr-x    1 0        0            5633 Nov 11 16:14 centos7-ok-11-12.cfg
-rwxr-xr-x    1 0        0            5739 Nov 12 03:09 centos7.cfg
drwxr-xr-x    3 0        0              57 Oct 26  2020 images
drwxr-xr-x    2 0        0             198 Nov 02  2020 isolinux
drwxr-xr-x    2 0        0            4096 Nov 04  2020 repodata
##  TFTP server 저장소에 PXE kernel image file을 복사하는 절차


$  mkdir  /var/lib/tftpboot/networkboot/centos
$  cp  /var/ftp/pub/centos/images/pxeboot/{inird.img,vmlinuz}  /var/lib/tftpboot/networkboot/centos/

 

 

Kickstart Configuration File 작성

centos7.cfg 파일의 내용이 길어서 보기 어려울 수 있으나, 원래 OS 패키지에 기본 제공되는 centos7.cfg에 일부 내용만 수정하면 된다.

(참고:  /root/centos7.cfg 같은 곳에 OS 배포판에서 제공하는 기본 kickstart configuration 파일이 있다)

 

$  cat  /var/ftp/pub/centos/centos7.cfg 

## System authorization information

auth --enableshadow --passalgo=sha512

## Andrew
##  Use network installation
url --url="ftp://10.10.12.33/pub/centos/"

## Use graphical install
#graphical
text

## Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=vda

## Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'

## System language
lang en_US.UTF-8

## Network information
network  --bootproto=dhcp --device=eth0 --nameserver=10.10.12.2,10.10.12.3 --noipv6 --activate

## Root user's password
## NOTE:  Run this command `openssl passwd -1 mysmilepass`
##        and use the result string as a password for user.
rootpw --iscrypted $1$HC34jk4576jk23j4kljk5l6jk2j345kj

## System services
services --disabled="chronyd"

## System timezone
timezone Asia/Seoul --isUtc --nontp

## NOTE:  Run this command `openssl passwd -1 myhappypass`
##        and use the result string as a password for user.
user --groups=wheel --name=sejong --password=$1$HC34jk4576jk23j4kljk5l6jk2j345kj --iscrypted --uid=1000 --gecos="sejong" --gid=1000

## X Window System configuration information
#xconfig  --startxonboot

## System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=vda
autopart --type=lvm

## Partition clearing information
clearpart --all --initlabel --drives=vda

## Install software application
%packages
@^minimal
@base
@core
kexec-tools
net-tools
chrony
%end

## Enable KDUMP
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

## Policy of user password
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end


##
## NOTE (By Andrew)
##  Refer to  https://docs.centos.org/en-US/centos/install-guide/Kickstart2/#sect-kickstart-postinstall
##
%post --interpreter=/bin/bash

## NOTE (By Andrew)
myhostname=$(nslookup  $(hostname -I | awk '{print $1}') 10.10.12.30 | awk '{print $4}' |  cut -d '.' -f1)
hostname $myhostname
echo $myhostname > /etc/hostname

## Add authorized_keys for root user
mkdir  --mode=0700 /root/.ssh

cat << EOF > /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yaskdjfkjk34634jkdkfjg.....= sejong@MacBook-Pro.local
EOF

chown  -R root:root  /root/.ssh
chmod  0600  /root/.ssh/authorized_keys

## Add authorized_keys for sejong user
mkdir  --mode=0700 /home/sejong/.ssh

cat << EOF > /home/sejong/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yaskdjfkjk34634jkdkfjg.....= sejong@MacBook-Pro.local
EOF

chown  -R sejong:sejong  /home/sejong/.ssh
chmod  0600  /home/sejong/.ssh/authorized_keys

##
## Install Docker, Kubernetes
##
modprobe br_netfilter

cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

## disable swap space
sed -i '/swap/d' /etc/fstab
swapoff -a

## disable firewalld
systemctl stop firewalld
systemctl disable firewalld

## Install Docker container runtime
yum install -y yum-utils
yum-config-manager  --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl  enable  docker
systemctl  start   docker

mkdir -p /etc/docker
cat <<EOF | tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "insecure-registries": ["myhost.cncf:8080", "yourhost.cncf:8080"]
}
EOF

systemctl daemon-reload
systemctl restart docker

## Install kubeadm, kubelete
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

setenforce 0
sed  -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum  install  -y kubelet kubeadm kubectl  --disableexcludes=kubernetes
systemctl enable --now kubelet

chmod +x /etc/rc.d/rc.local
systemctl enable --now  rc-local.service

echo "END OF POST-SCRIPT" > /root/kickstart.log

%end


## Andrew
##  reboot after finishing installation
reboot

 

 

Ansible Playbook 작성 (Option)

만약, kickstart configration만으로 OS 초기화/설정하기 어려운  복잡한 Job이 있다면, 아래 예시처럼 Ansible playbook을 작성해서 좀 더 복잡하고 지능적인 처리가 가능하다.

 

## playbook-kube-cluster-join.yaml

- name: Joining Job Step 1 on Master node
  hosts: kubemaster
  tasks:
    - name: Generate join command
      command: kubeadm token create --print-join-command
      register: join_command
    - name: Copy join command to local file
      local_action: copy content="{{ join_command.stdout_lines[0] }}" dest="./join-command"

- name: Joining Job Step 2 on Worker node
  hosts: kubeworker
  tasks:
    - name: Copy the join command to server location
      copy: src=join-command dest=/tmp/join-command.sh mode=0777
    - name: Join the node to cluster
      command: sh /tmp/join-command.sh

 

 

 

 


 

준비 작업은 끝났다.

공장 초기화된 컴퓨터, 또는 VirtualBox 프로그램, 또는 KVM/Qemu의 Virtual Manager로 아래 예제처럼 Machine Start만 하면 된다.

 

 

OS  자동 설치 실행

 

나는 KVM/Qemu + Virtual Manager 조합으로 VM을 만드는 것을 좋아하기 때문에 KVM을 예시로 들었다.

Hypervisor는 어떤 것을 사용하든 PXE로 부팅하는 기능은 동일하기 때문에, 다른 Hypervisor를 사용하더라도 아래 절차는 비슷하다.

 

깡통 컴퓨터의 Booting Option 메뉴에서 또는 VM을 새로 생성하면서 PXE 옵션을 선택한다.

 

VM 생성시 PXE Network Boot 옵션 활성화

 

위와 같이 PXE boot 옵션을 선택 후, booting을 시도하면 아래 화면처럼 DHCP 서버에서 Network 주소 및 TFTP 정보를 가져와서 TFTP에서 boot image file을 가져온다. 이후부터는 자동으로 OS를 설치하고, kickstart confiration file에 있는 OS 설정 작업을 자동 수행한다.

 

PXE Booting 화면

 

 

 

Reference

 

'청년정신'님이 2019년 4월에 작성한 'PXE 기반의 CentOS  자동 구축' 블로그가 제일 잘 정리된 글 같다.

 

 

PXE 기반의 CentOS 설치 1부

 

 

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 1편

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 1편 [ PXE 개념 소개 및 구성요소 ] PXE (Preboot Excution Environment) 기반의 운영체제 자동설치 방법은 앞서 강좌에서 소개한 다양한 서버 구축 기..

youngmind.tistory.com

 

 

PXE 기반의 CentOS 설치 2부

 

 

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 2편

CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 2편 "CentOS 강좌 PART 2. 10 PXE기반의 CentOS 서버 자동 구축 1편" 에 이어서… 10. KickStart 구성 먼저 kickstart 파일을 구성한다. Kickstart 파일..

youngmind.tistory.com

 

 

추가로, CentOS를 kickstart를 이용해서 자동 설치하려는 경우라면, 아래 Install guide를 참고하면 좋다.

 

 

Kickstart Installations :: CentOS Docs Site

Kickstart installations offer a means to automate the installation process, either partially or fully. Kickstart files contain answers to all questions normally asked by the installation program, such as what time zone you want the system to use, how the d

docs.centos.org

 

'CentOS' 카테고리의 다른 글

CPU Pinning 예제 코드  (0) 2022.06.17
Install Ansible AWX (version 17.1.0)  (0) 2021.11.16
How to use Ansible and Playbook  (0) 2021.11.12
Samba(SMB) on CentOS  (0) 2021.07.10
Network config on CentOS 8  (0) 2021.07.10
반응형

 

작성일: 2024년 4월 15일

 

 

리스트 형태의 문자열(또는 Text 문서)에서  특정 컬럼만 추출하고 싶을 때가 있다.

이런 경우 cut 명령, awk 명령을 이용해서 아래 예제와 같이 문자열에서 원하는 부분을 분리(split, delimit)할 수 있다.

 

cut 명령 예제

## 예들 들어, "aa.bb.cc." 라는 문자열이 있다면,
## 아래와 같이 실행하면, "aa"만 뽑을 수 있다.

$  echo "aa.bb.cc."  |  cut -d '.' -f1
aa
$  echo "aa.bb.cc."  |  cut -d '.' -f2
bb
$  echo "aa.bb.cc."  |  cut -d '.' -f3
cc
$

 

awk 명령 예제

## 문자열에서 특정 word만 추출하고자 하면, 아래와 같이 실행한다.

$  echo  "10.10.12.49  10.10.12.30  192.168.122.1"  |  awk '{print $1}'
10.10.12.49

$  echo  "10.10.12.49  10.10.12.30  192.168.122.1"  |  awk '{print $2}'
10.10.12.30

$  echo  "10.10.12.49  10.10.12.30  192.168.122.1"  |  awk '{print $2 " -- " $3}'
10.10.12.30 -- 192.168.122.1

'Shell Script' 카테고리의 다른 글

sed 사용법 - 종합  (0) 2022.06.16
문자열에서 따옴표 떼어내기(제거하기)  (0) 2022.01.22
grep command with invert-match option  (0) 2021.10.06
Man page dump하기  (0) 2021.07.15
Bash shell script에서 Random 정수 만들기  (0) 2021.07.13
반응형

 


작성일: 2024년 1월 9일

 

Macbook에 USB Keyboard나 Bluetooth Keyboard를 연결해서 사용하다보면, 

Home과 End Key가 MS Windows와 달라서 불편하다.

 

Karabiner-Elements App을 설치하면 원하는대로 Key를 변경할 수 있지만, 나는 Macbook에 이것저것 App 설치하는 것이 싫어서 설정 파일을 직접 작성해서 Home, End Key 설정을 변경했다.

 

나중에 까먹고, 또 검색하느라 시간을 허비할 것 같아서 여기에 메모해둔다.

 

##  아래의 순서로 명령을 실행한다.

$ cd ~/Library
$ mkdir KeyBindings
$ cd KeyBindings
$ cat << EOF >> DefaultKeyBinding.dict
{
/* Remap Home / End */
"\UF729" = "moveToBeginningOfLine:"; /* Home */
"\UF72B" = "moveToEndOfLine:"; /* End */
"$\UF729" = "moveToBeginningOfLineAndModifySelection:"; /* Shift + Home */
"$\UF72B" = "moveToEndOfLineAndModifySelection:"; /* Shift + End */
}
EOF
$

위와 같인 .dict 파일을 생성했으면, Log Out하고 다시 Log In 한다. 

그러면 Home Key와 End Key의 설정이 바뀌어 있을 것이다.

 

더 자세한 내용은 아래 Git 문서를 참고하기.

https://gist.github.com/trusktr/1e5e516df4e8032cbc3d

 

My DefaultKeyBinding.dict for Mac OS X

My DefaultKeyBinding.dict for Mac OS X. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

위 Git 문서에서 중요한 부분만 발췌했다.

/* ~/Library/KeyBindings/DefaultKeyBinding.Dict

This file remaps the key bindings of a single user on Mac OS X 10.5 to more
closely match default behavior on Windows systems. This makes the Command key
behave like Windows Control key. To use Control instead of Command, either swap
Control and Command in Apple->System Preferences->Keyboard->Modifier Keys...
or replace @ with ^ in this file.

Here is a rough cheatsheet for syntax.
Key Modifiers
^ : Ctrl
$ : Shift
~ : Option (Alt)
@ : Command (Apple)
# : Numeric Keypad

Non-Printable Key Codes

Standard
Up Arrow:     \UF700        Backspace:    \U0008        F1:           \UF704
Down Arrow:   \UF701        Tab:          \U0009        F2:           \UF705
Left Arrow:   \UF702        Escape:       \U001B        F3:           \UF706
Right Arrow:  \UF703        Enter:        \U000A        ...
Insert:       \UF727        Page Up:      \UF72C
Delete:       \UF728        Page Down:    \UF72D
Home:         \UF729        Print Screen: \UF72E
End:          \UF72B        Scroll Lock:  \UF72F
Break:        \UF732        Pause:        \UF730
SysReq:       \UF731        Menu:         \UF735
Help:         \UF746

OS X
delete:       \U007F

For a good reference see http://osxnotes.net/keybindings.html.

NOTE: typically the Windows 'Insert' key is mapped to what Macs call 'Help'.
Regular Mac keyboards don't even have the Insert key, but provide 'Fn' instead,
which is completely different.
*/

{
    "@\UF72B"  = "moveToEndOfDocument:";                         /* Cmd  + End   */
    "~@\UF703" = "moveToEndOfDocument:";                         /* Cmd + Option + Right Arrow */

    "@$\UF72B" = "moveToEndOfDocumentAndModifySelection:";       /* Shift + Cmd  + End */

    "@\UF729"  = "moveToBeginningOfDocument:";                   /* Cmd  + Home  */
    "~@\UF702" = "moveToBeginningOfDocument:";                   /* Cmd + Option + Left Arrow */

    "@$\UF729" = "moveToBeginningOfDocumentAndModifySelection:"; /* Shift + Cmd  + Home */

    "\UF729"   = "moveToBeginningOfLine:";                       /* Home         */
    "~\UF702"  = "moveToBeginningOfLine:";                       /* Option + Left Arrow */

    "$\UF729"  = "moveToBeginningOfLineAndModifySelection:";     /* Shift + Home */
    "$~\UF702" = "moveToBeginningOfLineAndModifySelection:";     /* Shift + Option + Right Arrow */

    "\UF72B"   = "moveToEndOfLine:";                             /* End          */
    "~\UF703"  = "moveToEndOfLine:";                             /* Option + Right Arrow */

    "$\UF72B"  = "moveToEndOfLineAndModifySelection:";           /* Shift + End  */
    "$~\UF703" = "moveToEndOfLineAndModifySelection:";           /* Shift + Option + Left Arrow  */

    "\UF72C"   = "pageUp:";                                      /* PageUp       */
    "\UF72D"   = "pageDown:";                                    /* PageDown     */
    "$\UF728"  = "cut:";                                         /* Shift + Del  */
    "$\UF727"  = "paste:";                                       /* Shift + Ins */
    "@\UF727"  = "copy:";                                        /* Cmd  + Ins  */
    "$\UF746"  = "paste:";                                       /* Shift + Help */
    "@\UF746"  = "copy:";                                        /* Cmd  + Help (Ins) */

    "~j"       = "moveBackward:";                                /* Option + j */
    "~l"       = "moveForward:";                                 /* Option + l */
    "~i"       = "moveUp:";                                      /* Option + i */
    "~k"       = "moveDown:";                                    /* Option + k */

    "@~i"      = ("moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:",);                            /* Cmd + Option + j */
    "@~k"      = ("moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:",);                            /* Cmd + Option + j */

    "@\UF702"  = "moveWordBackward:";                            /* Cmd  + LeftArrow */
    "@~j"      = "moveWordBackward:";                            /* Cmd + Option + j */
    "@\U007F"  = "deleteWordBackward:";                          /* Cmd  + Backspace */

    "@\UF703"  = "moveWordForward:";                             /* Cmd  + RightArrow */
    "@~l"      = "moveWordForward:";                             /* Cmd + Option + l */
    "@\UF728"  = "deleteWordForward:";                           /* Cmd  + Delete */

    "@$\UF702" = "moveWordBackwardAndModifySelection:";          /* Shift + Cmd  + Leftarrow */
    "@$\UF703" = "moveWordForwardAndModifySelection:";           /* Shift + Cmd  + Rightarrow */
}

 


 

반응형

 

 


 

테스트한 날짜: 2024년 2월 15일
테스트 환경:  Ubuntu 22.04  /  Ubuntu 20.04  /  Ubuntu 18.04  (이 3개 버전 모두 잘 동작했다)

 


BIND 설치에 관해 참고하면 좋은 문서:
  https://www.hiroom2.com/2018/05/06/ubuntu-1804-bind-en/
BIND(DNS) 설정, 운영에 관해 참고하면 좋은 문서:   <-- 진짜 잘 만들어진 문서, 꼭 읽어볼 것 !!
  https://joungkyun.gitbook.io/annyung-3-user-guide/chapter5
    - BIND 기본 설정
    - 새 도메인 설정
    - Slave DNS 구성
    - Inverse domain 설정
    - DNSSEC 설정
    - GeoDNS 설정
    - Domain 위임
    - IDN

 

 

Install BIND pkg

 

##
## root 계정으로 아래 명령을 수행
##

$  apt  update

$  apt  install -y bind9

 

 

 

Configuration

 

파일명: /etc/bind/named.conf.options

options {
  directory "/var/cache/bind";
}

   참고: 원래 기본 설정이 위와 같기 때문에 수정할 내용은 없다.

 

파일명: /etc/bind/named.conf.local

zone "andrew.space" IN {
  type master;
  file "andrew.space.zone";
};

 

파일명: /var/cache/bind/andrew.space.zone

$TTL 86400

@ IN SOA andrew.space root.andrew.space (
  2021090500
  3600
  900
  604800
  86400
)

              A  10.10.9.11
              
@          IN NS ns1
           IN NS ns2

ns1        IN A  10.10.2.3
ns1        IN A  10.10.9.3

www        IN A  10.10.2.3
andrew     IN A  10.10.9.71

 

 

 

Validation (설정 값 유효성 확인)

 

$  named-checkzone  andrew.space  /var/cache/bind/andrew.space.zone
zone andrew.space/IN: loaded serial 2021090500
OK

 

 

 

Run BIND

 

$  sudo systemctl enable bind9
$  sudo systemctl restart bind9

 

 

Test

 

$  nslookup

##
## 방금 위에서 구성한 DNS 서버의 주소
##
> server 10.10.9.11
Default server: 10.10.9.11
Address: 10.10.9.11#53

##
## name zone db에 추가했던 domain name이 잘 resolution 되는 확인
##
> www.andrew.space
Server:		10.10.9.11
Address:	10.10.9.11#53

Name: www.andrew.space
Address: 10.10.2.3
>

 

 

'Ubuntu' 카테고리의 다른 글

추가 장착한 Disk Mount  (0) 2021.12.28
Root 계정의 SSH 로그인 허용  (0) 2021.12.28
openssl command example  (0) 2021.11.04
.bashrc 또는 .bash_profile 설정  (0) 2021.07.22
.vimrc 작성  (0) 2021.07.22
반응형
참고하면 좋은 Web Docs:

https://www.lesstif.com/software-architect/openssl-command-tip-7635159.html#OpenSSL%EC%9E%90%EC%A3%BC%EC%93%B0%EB%8A%94%EB%AA%85%EB%A0%B9%EC%96%B4(command)%EB%B0%8F%EC%82%AC%EC%9A%A9%EB%B2%95,tip%EC%A0%95%EB%A6%AC-%EC%9D%B8%EC%A6%9D%EC%84%9C%EC%A0%95%EB%B3%B4%EB%B3%B4%EA%B8%B0

 

 

 

openssl command cheat sheet

## Certificate Expiry 확인
$  openssl x509 -in my.crt -noout -enddate | cut -c10-40

## File 내용 확인
$ openssl rsa  -noout -text -in myprivate.key    # private key file
$ openssl req  -noout -text -in myreq.csr        # singing request file
$ openssl x509 -noout -text -in mycert.crt       # certificate file

## cerficate과 private key가 쌍이 맞는지 확인
$ openssl rsa  -in myprivate.key -modulus -noout | openssl md5
$ openssl x509 -in mycert.crt    -modulus -noout | openssl md5
$ openssl req  -in myreq.csr     -modulus -noout | openssl md5

Private Key를 생성하고,  Signing 요청하는 것은 아래 내용을 참고할 것!

 

Certficate 파일과 Private Key 파일의 Format 변환(DER/PEM)은 아래 내용을 참고할 것!

 

'Ubuntu' 카테고리의 다른 글

Root 계정의 SSH 로그인 허용  (0) 2021.12.28
Install BIND for name server(DNS) on Ubuntu 22.04  (0) 2021.11.05
.bashrc 또는 .bash_profile 설정  (0) 2021.07.22
.vimrc 작성  (0) 2021.07.22
iptables and netfilter  (1) 2021.07.10
반응형

 

작성일: 2024년 3월 1일

 

Pod 생성 방법 - A

급하게 Pod만 생성해서 Kubernetes 기능을 확인해야 할 경우가 있다.

이럴 때, 아래와 같이 명령 한번 실행해서 Pod를 deploy할 수 있다.

$ kubectl  create  deployment  nginx  --image=nginx

 

또는 아래와 같이  YAML 형식으로 Pod 배포가 가능하다.

 

Pod 생성 방법 - B

$  kubectl  create  namespace  andrew
$  kubectl  apply  -n andrew  -f -  <<EOF

apiVersion: v1
kind: Pod
metadata:
  name: almighty
  labels:
    app: almighty
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: almighty
    image: docker.io/andrewloyolajeong/almighty:0.2.4
    
EOF

 

 

[ 참고 ]
docker.io/andrewloyolajeong/almighty 컨테이너 이미지 내부 동작에 대한 설명
    - NGINX 서버 구동 (TCP 80 포트를 Listening)
    - SSHD 서버 구동 (TCP 22 포트를 Listening)
    - Golang으로 구현한 Simple HTTP Server 구동 (TCP 8080 포트를 Listeing)
    - Golang으로 구현한 UDP 서버 구동 (UDP 9090, 9091, 9092 포트를 사용)

 

 

그런 후에 아래와 같이 Service Resource도 만들 수 있다.

 

Service 리소스 생성 방법

$  kubectl  apply  -n andrew  -f -  <<EOF

apiVersion: v1
kind: Service
metadata:
  name: almighty
  annotations:
    ## 아래 nlb 타입은 UDP 패킷을 LB 처리하기 위한 설정이다.
    ## 만약, UDP 패킷을 처리할 일이 없다면, "nlb" 타입을 지정하지 않아도 된다.
    oci.oraclecloud.com/load-balancer-type: "nlb"  ## Oracle Cloud를 사용하는 경우 설정
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local     ## Public Cloud를 사용하는 경우 설정
  selector:
    app: almighty
  ports:
    - name: myweb
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: yourweb
      protocol: TCP
      port: 1080
      targetPort: 80
    - name: myudp
      protocol: UDP
      port: 9090
      targetPort: 9090
  
EOF

 

PV 생성

진짜 간단하게 PV, PVC 생성에 관해서 작성하려고 했는데 Private Cloud 환경과 Public Cloud 환경에 따라 생성 방법이 다르고,

Public Cloud Infra를 제공하는 회사마다 Manifest 작성 방법이 다 달라서 이 부분은 아래와 같이 해당 Public Cloud Infra의 Web Docs 주소를 남기는 것으로 마무리하겠다.

가장 많이 사용되는 CSI[Cluster Storage Interface] 몇 가지 사례만 사용법을 익히면 될듯하다.

 

Oracle Cloud Infra를 사용한다면, 아래 Web Docs를 읽고 예제를 따라하면 잘 동작한다.

https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim.htm

 

Creating a Persistent Volume Claim (PVC)

When a PVC is created using the CSI volume plugin (provisioner: blockvolume.csi.oraclecloud.com), you can expand the volume size online. By doing so, you make it possible to initially deploy applications with a certain amount of storage, and then subsequen

docs.oracle.com

 

 

 

 

반응형

Kubernetes나 Docker를 이용해서 이것저것 사용하다보면, 나중에는 사용하지 않고 남아 있는 쓰레기 image들이 있다.

이것들을 한방에 지우는 스크립트를 작성했다.

 

아래 Script는 ":5000" 문자열을 포함하는 container image만 찾아서 지운다.

#!/usr/bin/bash

REMOVE_ITEM_LIST=$(docker image ls | grep ":5000" | awk '{ printf "%s:%s\n", $1, $2 }')

for REMOVE_ITEM in $REMOVE_ITEM_LIST
do
  echo "TO Remove:  $REMOVE_ITEM"
  docker image rm $REMOVE_ITEM
done

 

+ Recent posts