설치

하둡은 java기반이라 java sdk설치가 필요.

sudo apt-get update
sudo apt-get install default-jdk

그다음, 도커 이미지 받아서 그 안에서 연습해볼수도 있지만, 제대로 하려면 아래처럼 다운받고 설정하는 과정이 필요

# 하둡의 공식 웹사이트에서 최신 버전을 다운받아 설치
sudo wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz

# 압축풀고 설정진행
tar -xvf hadoop-3.3.0.tar.gz
sudo mv hadoop-3.3.0 /usr/local/hadoop
#~/.bashrc에 아래 것들 추가
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64


#반영
source ~/.bashrc

그다음 어떤 파일시스템을 하부로 쓸것인지 설정파일들을 좀 만져야함. 기본으로 깔렸을때는 hdfs가 아닌 로컬파일시스템을 쓰도록 되어 있음(;;)

# sudo vi $HADOOP_HOME/etc/hadoop/core-site.xml
# <configuration> 태그 사이에 아래내용 추가
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value><!--이거 해줘야 로컬파일시스템이 아닌 hdfs씀-->
</property>

# sudo vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
# <configuration> 태그 사이에 아래내용 추가

<property>
    <name>dfs.replication</name>
    <value>1</value> <!--HDFS에 저장되는 각 데이터 블록이 클러스터 전체에서 복제되는 횟수를 결정-->
</property>

단일노드가 아닌 클러스터 구성시 추가 설정들이 필요(여기서는 생략)

 

다음은 포맷하고 전체시작

# 처음에 포맷해줘야 함
hdfs namenode -format

#전체 재시작
cd /usr/local/hadoop/sin
./stop-all.sh
./start-all.sh

#java ps. 아래처럼 NameNode, DataNode, SecondaryNameNode가 뜨는것을 확인
jps
128290 SecondaryNameNode
127865 NameNode
128026 DataNode

 

HDFS기본 핸들링 방법

아래처럼 hdfs dfs로 시작하는 명령을 주거나,  Hadoop이 제공하는 Hadoop FUSE(FIlesystem in USErspace) 모듈을 이용하면 기존파일시스템에 mount해서 ls,mv,cp등 그대로 사용하는 것도 가능

# /logs라는 폴더 만들기
hdfs dfs -mkdir /logs

# ls하기. Hadoop Distributed File System (HDFS)의 루트 디렉토리 내용을 나열
hadoop dfs -ls /
Found 1 items
drwxr-xr-x   - sevity supergroup          0 2023-07-29 13:20 /logs

# 파일 복사하기.
hdfs dfs -put iis_logs/* /logs

# 헬스체크
hdfs fsck /

 

 

트러블슈팅

기본적인 로그 모니터링

tail -f /usr/local/hadoop/logs/*.log

start-dfs.sh로 하둡을 시작했을때 namenode가 시작되지 않았을때(jps했을때 안보일때)

# 아래 명령으로 이유 파악
 grep -C 5 'ERROR' $HADOOP_HOME/logs/hadoop-sevity-namenode-sevityubuntu.log

# 만약 아래처럼 /tmp 아래 디렉토리 접근이 안된다는 것이면
2023-07-30 16:03:30,469 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-sevity/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
        at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:392)

# hdfs-site.xml을 열어서 경로를 /tmp가 아닌 /var/lib등 임시가 아닌곳으로 옮겨준다.
vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
아래 내용 추가
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>/var/lib/hadoop-hdfs/cache/hdfs/dfs/name</value>
    </property>

# 관련 폴더 만들고 권한 부여
sudo mkdir -p /var/lib/hadoop-hdfs/cache/hdfs/dfs/name
sudo chown -R sevity:sevity /var/lib/hadoop-hdfs/cache/hdfs/dfs/name

# 아래명령어로 다시 실행
stop-dfs.sh
start-dfs.sh

datanode가 시작되지 않을때

# jps 했는데 datanode관련된게 안보이면
grep -C 5 "ERROR" $HADOOP_HOME/logs/hadoop-*-datanode-*.log
# 아래와 같은 로그면
2023-07-30 16:24:23,819 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid 6b5e2ab5-f8a4-4eb8-b3d3-fe37de728e60) service to localhost/127.0.0.1:9000. Exiting.

# 다음처럼 /hadoop/data 안에 있는 데이터를 날려준다(데이터 포맷은 각오)
rm -rf /hadoop/data/*

부팅할때마다 hdfs 구동되도록 하기(기본적으로는 항상 start-dfs.sh로 시작해줘야함)

sudo vi /etc/systemd/system/hadoop-hdfs.service # 해서 아래내용 입력
[Unit]
Description=Hadoop HDFS
After=network.target

[Service]
User=sevity
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
ExecStart=/usr/local/hadoop/sbin/start-dfs.sh
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

# 그 다음 다음을 입력해서 systemctl 리로딩하고, enable을 통해서 부팅시마다 시작되도록 함
sudo systemctl daemon-reload
sudo systemctl enable hadoop-hdfs

# 재부팅해서 jps해서 다음처럼 namenode, datanode, SecondaryNameNode 3가지 띁거 확인
jps
4673 SecondaryNameNode
3929 NameNode
4255 DataNode

# 마지막으로 헬스체크
hdfs fsck /

 

 

 

 

병렬처리 관련 중요 포인트

mapper가 병렬처리되는것으로 보이나 reducer는 모든 mapper가 끝나야 작업을 시작할 수 있나?
네, 맞습니다. MapReduce 모델에서 Mapper와 Reducer의 작업은 서로 다른 단계에 속하며, 이는 병렬 처리와 데이터 의존성 문제 때문입니다.
Mapper: 각 Mapper는 독립적으로 입력 데이터의 한 부분을 처리하며, 그 결과를 키-값 쌍의 형태로 출력합니다. 이 과정은 병렬로 진행될 수 있으며, 여러 컴퓨터 또는 프로세서 코어에서 동시에 일어날 수 있습니다.
Shuffle and Sort: Mapper의 출력은 모든 Reducer에게 보내지기 전에 "Shuffle and Sort" 단계를 거칩니다. 이 단계에서는 동일한 키를 가진 모든 데이터를 같은 Reducer로 라우팅하고, 키에 대한 데이터를 정렬합니다.
Reducer: Reducer는 키별로 그룹화된 데이터를 받아 처리합니다. 이 과정에서 Reducer는 자신에게 할당된 특정 키에 대한 모든 데이터를 받아야만 작업을 시작할 수 있습니다. 이는 각 키에 대한 모든 값들이 Reducer에서 합쳐지거나 처리되어야 하기 때문입니다. 따라서 Reducer는 모든 Mapper의 작업이 끝나야만 시작됩니다.
이와 같은 방식은 분산 환경에서 대규모 데이터를 처리하는 데 효율적인 방법을 제공합니다. Mapper는 독립적으로 실행되므로 컴퓨터 클러스터의 모든 머신을 활용할 수 있습니다. Reducer는 특정 키에 대한 모든 데이터를 처리하므로, 결과를 재결합하거나 요약하는 작업을 처리할 수 있습니다. 이 모델의 중요한 특성 중 하나는 개발자가 병렬 처리에 대한 세부 사항을 걱정할 필요가 없다는 것입니다. 이는 MapReduce 프레임워크가 처리하기 때문입니다.

반응형

ubuntu 기준으로는 sudo apt install docker.io로 설치가능하나, 라즈베리파이 기준으로는 너무 오래된 docker가 설치되거나 설치가 안될수 있어서 다음 방법으로 설치하는걸 추천한다고 함

curl -sSL https://get.docker.com | sh

만약 sudo apt-get install로 하려면 다음과정을 거쳐도 됨

# 또는 아래 방법도 가능
#1. 먼저, 기존에 설치되어 있는 Docker 패키지를 제거합니다(있는 경우):
sudo apt-get remove docker docker-engine docker.io containerd runc
#2. Docker설치를 위한 패키지 업데이트
sudo apt-get update
#3. Dockertㅓㄹ치에 필요한 패키지들 미리 설치
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
#4. Docker의 공식 GPG추가(Docker에서 제공했고 신뢰할수 있다는 디지털 서명)
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
#5. Docker repository를 APT sources에 추가합니다(APT:패키지관리자 가 인식할수있도록 저장소추가)
echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
#6. 다시 패키지를 업데이트한 후 Docker를 설치합니다: (이제 apt-get사용가능)
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

설치후 잘 설치됐는지 확인하고 특정 사용자에게 docker그룹추가를 통한 일종의 docker sudo권한 부여

# 잘 설치되었는지 확인
sudo docker images 
sudo docker run hello-world
# sevity사용자를 Docker그룹에추가(해당사용자가 root가 아니어도 docker명령을 다룰수 있게 해줌)
sudo usermod -aG docker sevity

 

docker images해보면 현재 서버에 있는 도커이미지들 목록이 나온다. (일종의 git으로 치면 로컬 저장소개념으로 원격서버에 저장된건 아님)

$ docker images
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
auth-service_auth-service   latest    cf72ade83f7f   7 hours ago    455MB
postgres                    13        9ca11a5f9994   12 days ago    350MB
hello-world                 latest    38d49488e3b0   2 months ago   4.85kB

특정 image를 지우려면 docker rmi 사용가능. 예를들어 docker rmi  9ca11a5f9994

 

Dockerfile을 만들고 아래처럼  build하면 된다.(맨뒤 .은 생략불가하면 Dockerfile 위치를 나타낸다)

docker build -t auth-service .

Dockerfile에 대한 샘플은 여기참조

 

실행은 다음처럼 docker run으로 하면 된다.

docker run auth-service

환경변수 설정이 필요한 경우 다음처럼 -e를 쓰면됨

docker run -e "ENV_VAR_NAME1=value1" -e "ENV_VAR_NAME2=value2" my-image

하지만 커멘드라인이 길어지니 docker-compose.yml에 다음처럼 기록가능

version: '3.8'
services:
  auth-service:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - DATABASE_URL
      - DATABASE_USERNAME
      - DATABASE_PASSWORD

이경우 docker run이 아닌 docker-compose 를 쓰면 된다.

docker-compose up을 하면 docker build와 docker run을 모두 수행하며,

docker-compose build를 하면 docker build까지만 된다.

docker-compose를 쓰면 여러 도커이미지를 동시에 켜거나 끄는등의 동시 핸들링에도 용이하다.

docker-compose up --build를 해서 --build 옵션을 주면 실행전 무조건 빌드를 거치게 된다.

 

AWS와 연동하기

Elastic Container Service (ECS)는 Docker 컨테이너를 쉽게 배포, 실행 및 스케일링할 수 있게 해주는 완전관리형 컨테이너 오케스트레이션 서비스입니다.이걸 사용해서 연동해보겠습니다.

ECS는 아마존 EC2 인스턴스나 AWS Fargate를 사용하여 실행할 수 있습니다.

 

AWS Elastic Container Service(ECS)를 사용해 애플리케이션을 배포하려면 다음과 같은 단계를 따릅니다.

1. AWS 계정 생성: AWS에서 제공하는 서비스를 이용하려면 먼저 AWS 계정이 필요합니다. 계정이 없다면 AWS 웹사이트에서 생성할 수 있습니다.

2. Docker 이미지를 Docker Hub에 푸시: 먼저, 로컬에서 Docker 이미지를 생성한 후 이를 Docker Hub에 푸시합니다.

# 로컬에서 Docker 이미지를 빌드합니다. 
docker build -t online-judge-auth-service .

# Docker Hub에 로그인합니다.
docker login --username=your-username --password=your-password

# Docker Hub에 이미지를 푸시합니다.
docker tag online-judge-auth-service:latest your-username/online-judge-auth-service:latest
docker push your-username/online-judge-auth-service:latest


3. ECS 클러스터 생성: AWS Management Console에 로그인한 후, ECS 페이지로 이동해 새 클러스터를 생성합니다. 

4. Task Definition 생성: ECS 클러스터 내에 'Task Definitions' 페이지로 이동해 새로운 Task Definition을 생성합니다. 이 과정에서 Docker 이미지의 위치(Docker Hub의 URL), 컨테이너에 필요한 CPU와 메모리, 포트 매핑 등을 설정합니다.
* 이 과정이 좀 중복적으로 느껴지고 직관적이지 않았지만 필요했다.

5. ECS Service 생성: 생성한 Task Definition을 이용해 ECS Service를 생성합니다. 이 과정에서 원하는 수의 Task를 실행하도록 설정하고, 필요한 경우 로드 밸런서를 설정합니다.

* 이번 프로젝트에서는 로드밸런서는 사용하지 않고 그냥 EC2인스턴스로 실행

6. 보안 그룹 설정 확인: 생성한 ECS Service가 외부에서 접근 가능하도록, 해당 서비스가 사용하는 보안 그룹의 인바운드 규칙을 확인합니다. 필요한 경우 포트를 열어줍니다.
* 보안규칙을 통해 8080포트를 열어줘야 했다.

7. 서비스 확인: ECS Service가 성공적으로 시작되면, Task의 IP 주소나 연결된 로드 밸런서의 DNS 이름을 이용해 애플리케이션에 접근해봅니다.

* curl로 접근해보니 잘 되었다.

이러한 단계들은 AWS Management Console을 통해 수행할 수 있지만, AWS CLI나 SDK를 이용해 스크립트로 자동화할 수도 있습니다. 비록 초기 설정에는 약간의 시간이 소요될 수 있지만, 한 번 환경을 구성하고 나면 새로운 버전의 애플리케이션을 쉽게 배포할 수 있습니다.

 

이해하기 따라로웠던개념들

1. VPC: 이건 가상서버라는 개념이 아니라 가상랜환경이란 의미에 가까웠다. 랜환경안에 여러 호스트가 있을 수 있는..

2. 서브넷개념: 서브넷을 여러개 분리해서 둘 수 있었는데 물리적으로 다른 위치로 구성할 수 있었다. 서브넷은 쉽게 말해서 공유기나 스위치로 묶이는 작은 단위라고 볼 수 있다.

3. 인스턴스 설정후 키페어 설정후 다음 커멘드로 ssh접속이 가능했다.

ssh -i /path/my-key-pair.pem ec2-user@my-instance-public-dns-name

4. ssh로 들어가서 도커를 수동으로 시작하려면 다음명령어를 사용

sudo docker run -p 8080:8080 -e DATABASE_URL='jdbc:postgresql://sevity.com:5432/online_judge' -e DATABASE_USERNAME='online_judge_admin' -e DATABASE_PASSWORD='password_here' ee6ac0195619

 

Docker Image관련

docker images: 생성된 image나열하기

sevity@sevityubuntu:~/workspace/online_judge/problem-frontend$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
frontend-service   latest    34ae6e43cd4e   4 hours ago     1.92GB
problem-service    latest    a360d436d839   4 hours ago     517MB
auth-service       latest    befdc9e37ac1   4 hours ago     526MB
<none>             <none>    96430f927c57   4 hours ago     526MB
<none>             <none>    58e82ecb1610   11 hours ago    1.92GB
<none>             <none>    f9bb20adb713   35 hours ago    1.92GB
<none>             <none>    de59f27bcff9   2 days ago      1.92GB
<none>             <none>    c4cf8ec43872   3 days ago      1.92GB
<none>             <none>    25e3f42a4b64   4 days ago      1.92GB

docker system prune: 불필요한 이미지, 컨테이너, 볼륨 및 네트워크를 일괄 삭제

위의 <none>처럼 누적되는 image들 정리가능(Docker 이미지 빌드 과정에서 새로운 이미지 태그를 생성할 때마다 새로운 이미지 ID가 생성되는데, 만약 이전 이미지 태그를 유지하지 않고 새로운 태그를 계속 생성한다면, <none> 태그와 함께 이전 버전의 이미지가 누적될 수 있다. 이러한 누적은 디스크 공간을 차지하므로, 불필요한 이미지를 정리하는 것이 좋다.)

sevity@sevityubuntu:~/workspace/online_judge/problem-frontend$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
7e93e0f073dccae0ea2ec28b7051138a38fb8137feb8bd1b9e9c5d9df1a084ab
c18f484efede43192c18b4987096409454ac358a6ca802c93061ad233d3a214a

Deleted Networks:
auth-service_default
my-network
problem-service_default

Deleted Images:
deleted: sha256:2d86f8a15708197b0dcdb54d2461d060b289ac122e1f49d27e79ada0b34f01b2
deleted: sha256:52c9722d7ab889e55af2f0f8d1540f5b218a6e40df5b5fa331bcb1a08ac6aa5b
deleted: sha256:d6d5fafa7731073ac0bf4e2d731d04dc413fae64a39de29255e6b530fada5f97
deleted: sha256:708bb9cc93ee48ba372c9d329441b1735717e09516670cf08dbe2518f02261d5

Deleted build cache objects:
i8eaq1edr2a8koj2n1o043xva
wpr37m52re2lf3gmkndy630t6

Total reclaimed space: 31.52GB

 

docker rmi: 특정 image 삭제

 

 

모든 image삭제하기(아래 과정을 거쳐야 의존성 문제가 해결되면서 다 지워진다)

# 모든 컨테이너 정지:
docker stop $(docker ps -aq)
# 모든 컨테이너 삭제:
docker rm $(docker ps -aq)
# 모든 이미지 삭제:
docker image prune -a

 

Docker Container 관련

Docker Container는 현재 실행 중인 Docker image를 의미하며

docker ps를 하면 컨테이너의 목록을 나열한다(어떤 포트를 listen하고 있는지도 알 수 있다)

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS       PORTS                                       NAMES
7e93e0f073dc   problem-service    "java -jar /app/app.…"   3 hours ago   Up 3 hours   0.0.0.0:9993->9993/tcp, :::9993->9993/tcp   cranky_yonath
b2fb854a135c   frontend-service   "docker-entrypoint.s…"   3 hours ago   Up 3 hours                                               frontend-service
b4bf33f71cf4   auth-service       "java -jar /app/app.…"   3 hours ago   Up 3 hours                                               affectionate_feynman4

docker ps --filter "expose=9993"를 하면 특정 포트만 필터링해서 볼 수도 있다.

$ docker ps --filter "expose=9993"
CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                                       NAMES
7e93e0f073dc   problem-service   "java -jar /app/app.…"   3 hours ago   Up 3 hours   0.0.0.0:9993->9993/tcp, :::9993->9993/tcp   cranky_yonath

docker stop을 통해 실행중인 docker container를 종료할 수 있다.

주의할점은 위의 docker ps결과에 나온 컬럼기준으로 IMAGE이름으로는 안되고 CONTAINER_ID또는 맨 오른쪽 컬럼인 NAMES를 인자로 주어야 동작한다는 점이다.

# IMAGE이름으로는 stop이 안된다.
$ docker stop problem-service
Error response from daemon: No such container: problem-service

# CONTAINER_ID나 NAME으로는 가능
$ docker stop 7e93e0f073dc
7e93e0f073dc

만약 IMAGE이름으로 stop하고 싶다면 다음처럼 해준다.

# problem-service라는 이름의 IMAGE로 부터 생성된 container 모두를 stop한다.
$ docker ps -q --filter ancestor=problem-service | xargs docker stop
7e93e0f073dc

 

docker stop을 했다고 해도 지워진건 아니며 docker rm을 통해 지워줘야 한다.

stop된 컨테이너를 포함해서 조회하려면 docker ps -a를 해주면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'Programming > Linux' 카테고리의 다른 글

하둡 - 실습 - 웹서버로그분석  (0) 2023.07.29
하둡(Hadoop)  (0) 2023.07.29
vimdiff  (0) 2021.04.07
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
Ansible  (1) 2020.10.22

vim -d a.cpp b.cpp 하면 기본적으로 diff모드로 두 파일을 열어준다.

 

]c 또는 [c로 다음, 이전 변경사항으로 커서를 이동한다.

 

zr로 묶인 부분을 풀어준다.

반응형

'Programming > Linux' 카테고리의 다른 글

하둡(Hadoop)  (0) 2023.07.29
Docker 설치, 초기설정, 명령어가이드  (0) 2023.07.17
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21

ssh를 통해서 tkinter 프로그램을 돌리느라 x11을 사용하게 되었는데, 

여러군데서 ssh를 접속하는 경우 DISPLAY문제로 원하는 호스트 쪽에서 제대로 app이 뜨지 않는 문제(hang)가 발견돼서 며칠고생했다.


해결한 방법은 결국 x11 커맨드라기 보다는,

w 명령어를 통해 다음과 같이 접속한 ssh세션을 나열하고, pkill -9 -t pts/0 이런 명령어를 통해 원치 않는 호스트쪽 세션을 정리하는 거였다.


여기참조함

반응형

'Programming > Linux' 카테고리의 다른 글

Docker 설치, 초기설정, 명령어가이드  (0) 2023.07.17
vimdiff  (0) 2021.04.07
Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21
vim  (0) 2020.09.20

여기 참조

 

왜사용?

하나의 서버에서 다른 서버들을 원격으로 관리하면서, 배포같은 작업을 수행하고자 할 때 편함

ansible 내부적으로 원격으로 다른 서버를 조작하는데는 ssh가 쓰임

ansible설치는 하나의 서버에만 하면됨. (조작을 당하는 서버에는 ansible설치 필요 없음)

python으로 만들어진듯

 

할수 있는 일

설치 yum, apt-get, ...

다운로드 git, get_url, ...

실행 shell, task, ...

 

 

설치

centos기준  $sudo yum install ansible

 

host설정

원격으로 관리할 서버들을 지정해준다.

sudo vi /etc/ansible/hosts를 열어서 열거해주면 된다. 그룹도 지원.

예를들면 다음과 같이 써준다.

1
2
3
[myhome]
127.0.0.1
 
cs

 

host별로 ssh-key복사해주기

여기보고 따라하면 된다.

$ ssh-keygen -t rsa -C "userid@127.0.0.1" 이걸로 ssh-key만들어주고

$ ssh-copy-id userid@127.0.0.1 이걸로 host마다 복사해주면됨

 

ping날려보기

host설정이 잘된지 확인하기 위해 다음 명령어를 날려볼 수 있다.

$ ansible myhome -m ping

전반적인 single line, adhoc command에 대해서는 여기 참조 < 강추.. 하나씩 따라해보자

 

playbook사용해서 여러줄 동시에 실행하기

여기, 여기, 여기 참조 < 이것도 두번째 링크 강추 

 

 

 

playbook은 yaml 문법을 사용하고, jinja문법으로 분기등 약간의 프로그래밍이 가능하다, 

 

로깅

/etc/ansible/ansible.cfg에 log_path를 정해준대로 로깅이 된다.

 

 

task만으로도 playbook을 돌릴 수 있는데, role이 별도로 필요한 이유는 뭘까?

jenkins와의 차이점은 뭐지?

 

 

Agentless automation tool?

Ansible does not add a database, and there will be no daemons to start or keep running.

 

play book을 yaml을 사용해서 기술

반응형

'Programming > Linux' 카테고리의 다른 글

vimdiff  (0) 2021.04.07
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
tmux and byobu  (0) 2020.09.21
vim  (0) 2020.09.20
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10

유용한 byobu 명령어

세로 split: Ctrl + F2

pane 전환: Shift + 화살표 

pane rotation: Ctrl + F3, Ctrl + F4

window탭이름수정: F8

 

유용한 tmux 명령어

(prefix가 Ctal + A라고 가정)

세로 split: ctrl + A, %

가로 split: Ctrl + A, |

pane 전환: Ctrl + A, 화살표

pane resize: Ctrl + A, Ctal + 화살표

window 순서를 Ctrl+좌우화살표로 바꾸기위해 다음 명령어 입력
Ctrl + A, :, bind-key -n C-Left swap-window -t -1
Ctrl + A, :, bind-key -n C-Right swap-window -t +1
 
만약 위의 키바인딩을 취소하고 싶으면, 다음과 같은 식으로 하면 된다. 
Ctal _ A, :, unbind-key -n C-Left 

그런데 C-[의 경우는 ESC키와 간섭이 있으므로 사용하지 말것!

반응형

'Programming > Linux' 카테고리의 다른 글

X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
Ansible  (1) 2020.10.22
vim  (0) 2020.09.20
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10
NTP설정  (0) 2020.03.30

초기세팅

~/.vimrc 파일을 아래와 같이 편집

" search
set hlsearch  " highlights all search patterns
set ignorecase
set smartcase  " if you type, '/Copyright' it will be case sensitive

" auto indent
set autoindent     " 새로운 줄 시작시 이전줄의 들여쓰기를 복사
set cindent
set smarttab       " tab누르면 공백들이 대신 들어감(들여쓰기할때만)
set smartindent    " 중괄호나 주석등에 반응하여 들여쓰기 조정
set showmatch      " 중괄호등 짝보여주고 이동 가능

" tab size
set tabstop=4      " how many columns vim will use to print tab
set shiftwidth=4   " vim use when you hit >> or vim does auto indenting
set softtabstop=4  " vim use when you hit tab in insert mode
set expandtab      " tab will be converted to spaces

" scroll
set scrolloff=5  " when page up/down(ctrl + F/B)


" etc
syntax on   " syntax coloring
set number  " line number
set backspace=indent,eol,start  " backspace key will delete everything
set visualbell
set showcmd  " when you type 'y2d', intermediate command will be shown
map <leader>b Oimport pudb; pudb.set_trace()
" set colorcolumn=80
set termguicolors

 

vim plugin manager

vim을 정말 visual studio 수준의 IDE로 쓰려면 plugin manager를 통해 여러 plugin을 설치해서 써야한다.

plugin manager 자체도 여러가지가 있는데, 국산이기도 하고 심플하고 강력한 vim-plug를 추천

texteditor 색깔에 대해서는 여기를 참조하는걸 추천(사용가능한 airline theme list는 여기 참조)

 

그 이후 초기 설치 방법은 여기를 참조

다양한 plugin들은 여기서 검색 가능

 

 

 

반응형

'Programming > Linux' 카테고리의 다른 글

Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10
NTP설정  (0) 2020.03.30
supervisor  (0) 2020.03.18


ls -l 하면 파일의 퍼미션정보를 보여주는데, username, groupname도 순서대로 보여준다.

1
2
3
4
5
6
7
8
9
10
11
12
[wi.kim@wikim-osx ~]$ ls -l
total 326224
drwxrwxrwx@ 10 wi.kim  DNCO\Domain Users       320  4 26  2018 AgentInstaller_Mac64
drwxr-xr-x   2 wi.kim  DNCO\Domain Users        64  5 19  2017 AnacondaProjects
drwxr-xr-x   9 wi.kim  DNCO\Domain Users       288  4 18  2019 AndroidStudioProjects
drwx------   5 wi.kim  DNCO\Domain Users       160  1 29  2019 Applications
drwxr-xr-x   8 wi.kim  DNCO\Domain Users       256  2 21 14:53 CLionProjects
drwx------+ 21 wi.kim  DNCO\Domain Users       672  1 28 14:25 Desktop
drwx------+  5 wi.kim  DNCO\Domain Users       160  4  9 14:17 Documents
drwx------+  6 wi.kim  DNCO\Domain Users       192  4  9 17:16 Downloads
-rw-r--r--@  1 wi.kim  DNCO\Domain Users    145634 10 20  2016 KakaoTalk_Photo_2016-10-20-11-40-50_1.jpeg
-rw-r--r--@  1 wi.kim  DNCO\Domain Users    174827 10 28  2016 KakaoTalk_Photo_2016-10-28-16-36-25.jpeg
cs




id wi.kim 처럼 하면 다음처럼 기본적인 uid, gid와 더불어서 속한 모든 그룹에 대한 정보를 준다.

uid=513(wi.kim) gid=500(dev) groups=500(dev), 510(graphics)


특정 파일에 대한 user, group ownership 바꾸기

chmod wi.kim:mygroup filename 이렇게 하면 된다.



질문.

그룹퍼미션은 어떤경우에 쓰이는가

위의 rwxrwxrwx중에서 중간3개 그룹퍼미션 따라갈 것 같네..

프로그램을 실행할 경우 권한은 어떻게 되는가

파이선으로 간단히 테스트 해봤을때는 실행한 사람의 권한을 따라가는 것 같다.



반응형

'Programming > Linux' 카테고리의 다른 글

tmux and byobu  (0) 2020.09.21
vim  (0) 2020.09.20
NTP설정  (0) 2020.03.30
supervisor  (0) 2020.03.18
ssh 자동로그인(ssh-key)  (0) 2020.03.10

CentOS 기준..


/etc/ntp.conf 추가 

server time1.sevity.com

server time2.sevity.com


서비스 등록 확인

chkconfig --list | grep ntpd


재시작

/etc/init.d/ntpd restart


확인

ntpq -p 

여기서 앞에 *붙으면 싱크받고 있음을 의미


아래는 CentOS 7기준

firewall-cmd --add-service=ntp --permanent

방화벽을 다시 로드합니다.

firewall-cmd --reload


서비스 시작

ntp 서비스를 시작합니다.

systemctl start ntpd


시스템 재부팅 후에도 자동으로 시작할 수 있도록 합니다.

systemctl enable ntpd



반응형

'Programming > Linux' 카테고리의 다른 글

vim  (0) 2020.09.20
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10
supervisor  (0) 2020.03.18
ssh 자동로그인(ssh-key)  (0) 2020.03.10
scp관련  (0) 2019.12.05

여기 참조

 

CentOS기준.

 

CentOS7에서는 sudo systemctl start supervisord 하면 supervisor 서비스 시작할 수 있다.

CentOS6에서는 sudo /etc/init.d/supervisord start

 

sudo supervisorctl 해서 사용

 

가끔 supervisor.sock no such file 이라는 오류가 나면,

/etc/supervisor/conf.d/안에 있는 config파일이 오류일수 있다.

오류나는 파일을 제거하고

sudo systemctl restart supervisord하면 됨

 

supervisor.sock refused connection이라고 뜨면 재시작시도해보고 supervisord.pid문제로 기다린다고 뜨면

해당 pid를 강제로 지워주고 재시작하면 된다.

 

program등록법

/etc/supervisor.conf 또는 /etc/supervisor/conf.d/ 밑에 있는 conf들에서 [program] 섹션에 있는것들이 등록된다.

등록후 아래 명령어를 통해 갱신해줘야 적용된다.

sudo supervisorctl reread
sudo supervisorctl update

sudo 암호입력없이 쓰는법

 

sudo visudo를 해서 /etc/sudoers에 계정을 추가해주면되는데

sevity  ALL=(ALL:ALL) NOPASSWD: /usr/bin/supervisorctl

 

주의할점은 맨 아래다 하지 않으면 아래와 같은 경우 덮어써진다는 점이다.

# sevity가 sudo그룹에 속할 경우 
# 규칙은 가장 마지막에 적혀있는 sudo에 대한 규칙이 적용됩니다
sevity  ALL:(ALL) NOPASSWD: ALL
%sudo    ALL:(ALL) ALL


NOPASSWD부분은 무시돼 버린다.

/var/run/supervisor.sock 파일에 아래내용을 넣으면 sudo를 항상 생략하고 쓸 수 있다.

[unix_http_server]
file=/var/run/supervisor.sock
chown=sevity:sevity
chmod=02770

chmod=02770는 파일 또는 디렉토리의 그룹에게만 모든 권한을 부여(77부분)

 

로그보는법

/var/log/supervisor/에 가면 로그들 모여있다.

 

docker와 함께 운용하는법

docker는 supervisorctl stop을 해도 docker stop이 잘 되지 않는다. (일반 프로세스와 좀 다른듯하다)

supervisor는 command는 지원하지만 stopcommand는 지원하지 않아서 종료시에 명령어를 명시적으로 주기 어렵다.

그래서 command 안에다가 다음처럼 bash로 trap을 설정해두면 이건 잘 동작한다.

$ cat docker_run.sh

#!/bin/bash

PORT=$1
trap 'docker stop frontend-service' EXIT
docker run --rm\
  --name frontend-service\
  --network host \
  -p $PORT:$PORT \
  -e PORT=$PORT \
  frontend-service
반응형

'Programming > Linux' 카테고리의 다른 글

리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10
NTP설정  (0) 2020.03.30
ssh 자동로그인(ssh-key)  (0) 2020.03.10
scp관련  (0) 2019.12.05
mount관련  (0) 2019.12.05

+ Recent posts