maetesのブログ

個人用Memoです

NSD構築方法

Centos7 でNSD 構築方法を記載します。
なお、環境はAWSでデプロイします。

[1]DNS 用Cloudformation
AWSTemplateFormatVersion: "2010-09-09"
Description: dns
Parameters:
  Subnet1:
    Type: String
    Description: Subnet IDs for VPC
    Default: 'subnet-xxxxxx'
  SecurityGroup:
    Type: String
    Default: 'sg-xxxxxx'
    Description: SecurityGroup

Resources:
  gitlab:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ddea5e0f69c193a4" # Centos7, 7.9.2009, ap-northeast-1
      InstanceType: t2.medium
      KeyName: dev-key
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref Subnet1
          GroupSet: [ !Ref SecurityGroup ]
      Tags:
        - Key: "Name"
          Value: "dev-dns"
      UserData:
        Fn::Base64: |
            #!/bin/bash
            # hostname 設定
            hostnamectl set-hostname dns
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
            sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
            # install
            yum -y install epel-release
            yum -y install vim bind-utils nsd
            shutdown -r now
[2] 設定を入れる
server:
        server-count: 1
        do-ip4: yes
        zonesdir: "/etc/nsd" 
        database: "" 
        logfile: "/var/log/nsd.log" 
        pidfile: "/run/nsd/nsd.pid" 
        round-robin: yes
        minimal-responses: yes
        refuse-any: yes
        include: "/etc/nsd/server.d/*.conf" 
include: "/etc/nsd/conf.d/*.conf" 
remote-control:
        control-enable: yes
        control-interface: /run/nsd/nsd.ctl
zone:
        name: "example.com" 
        zonefile: "example.com.zone" 
$TTL 3600;
@ IN SOA ns.example.com. root.example.com. (
    2021050702  ; Serial
    3600       ; refresh
    900         ; retry
    3600000 ; expire
    3600 )     ; minimum
IN NS ns.example.com.
example.com. IN MX 10 mail.example.com.
@     IN A 192.168.1.1
mail IN A 192.168.1.2

[3] systemd start させてdig 打って確認

systemctl start nsd
dig +noall +answer @localhost mail.example.com

2021/05/07 News

気になったニュース

RotaJakiro: A long live secret backdoor with 0 VT detection

Linuxバックドア「RotaJakiro」発見の報告 少なくとも3年前から活動か - ITmedia エンタープライズ

東大が無料公開している超良質なPython/Data Science/Cloud教材まとめ (*随時更新) - Digital, digital and digital

混沌を極めるWindowsのssh-agent事情 - Qiita

最後の30年をどう生きるか - Chikirinの日記

gitlab runnner についてまとめてみた

gitlab runnnerのインストール・登録・挙動について正確に理解をしたいため、AWS環境を利用して確認をしてみました。
今回、runnner登録時はどちらから登録するのか?ポートは?というところと、具体的にどんなことができるのか?どう表現すればできるのか?というところが不明確であったため確認をしています。

AWS環境上で自動構築

Template を流すだけで環境ができるようにしました。
これによりまっさらな環境を誰でもいつでも構築して、挙動の確認ができます。
gitlab のサイズが900MB近くと大きいことと、インストールに時間がかかるため、だいたい20~30分ぐらい構築には時間がかかります。
気長に待ちましょう。

AWSTemplateFormatVersion: "2010-09-09"
Description: gitlab
Parameters:
  Subnet1:
    Type: String
    Description: Subnet IDs for VPC
    Default: 'subnet-xxxxxxxx'
  SecurityGroup:
    Type: String
    Default: 'sg-xxxxxxxx'
    Description: SecurityGroup

Resources:
  gitlab:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ddea5e0f69c193a4" # Centos7, 7.9.2009, ap-northeast-1
      InstanceType: t2.medium
      KeyName: dev-key
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref Subnet1
          GroupSet: [ !Ref SecurityGroup ]
      Tags:
        - Key: "Name"
          Value: "dev-gitlab"
      UserData:
        Fn::Base64: |
            #!/bin/bash
            # hostname 設定
            hostnamectl set-hostname gitlab
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
            sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
            # install
            yum -y install curl policycoreutils-python openssh-server vim bash-completion
            curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
            public_ip=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
            EXTERNAL_URL="http://${public_ip}" yum install -y gitlab-ee
            shutdown -r now
  gitlabrunnner:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ddea5e0f69c193a4" # Centos7, 7.9.2009, ap-northeast-1
      InstanceType: t2.micro
      KeyName: dev-key
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref Subnet1
          GroupSet: [ !Ref SecurityGroup ]
      Tags:
        - Key: "Name"
          Value: "dev-gitlabrunnner"
      UserData:
        Fn::Base64: |
            #!/bin/bash
            # hostname 設定
            hostnamectl set-hostname gitlabrunnner
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
            # install
            yum -y install curl vim bash-completion
            curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
            export GITLAB_RUNNER_DISABLE_SKEL=true; yum -y install gitlab-runner
            shutdown -r now

構築後gitlab runnner 設定

構築が完了したらgitlab とgitlab runnner の紐付けを実施します。

  1. gitlab のWeb 画面の特定リポジトリで登録するための情報を取得します。(repository 内 setting CI/CD -> Runnners に記載)
  2. runnner 側のインスタンスで下記コマンドを実行
gitlab-runner register

CI/CD の実行

設定が完了したので実際にCI/CDが実行できることを試してみます。

一番簡単なecho するだけの例

git commit/push で見てやるとrunnner が動いているのが確認できます
.gitlab-ci.yml

job-name:
  script:
    - echo "This is test1" >> /tmp/test

もう少し複雑な例1: pushしてきたbranch がMarge できるレベルの品質かどうかを確かめる(CI的)

例えば特定のファイルを検索してsort uniq した結果重複行があるかをチェックします

#!/bin/bash
result=$(cat targetfile | sort | uniq -d)
if [[ -n "${result}" ]]; then
  echo "target file has duplicate row"
  exit 1
fi
echo "target file is fine"
job-name:
  script:
    - bash duplicate_check.sh

というわけでスクリプト化してもっと複雑な例も作っていけそうです。

gitlab runnnerの挙動

gitlab runnnerの挙動としては、インストール場所に基づきますがrootでインストールした場合は下記のような場所にrepositoryに関するファイルが生成されます
/home/gitlab-runner/builds/yi84sU-f/0/root/repository_name/test.sh

感想

runnner は結構汎用性があり色々なことができそうです。
実装も今回bash でかきましたがそれ以外にも色々とコマンド実行をさせることで自動化を実現できます。
OSSでここまでできるというのは嬉しいですね。

AWSインスタンスを停止したり起動したりする場合のメモ

IPが変わる可能性があります。そんな場合は下記を実行してください * /etc/gitlab/gitlab.rbを開き external url を書き換えてgitlab-ctl reconfigure

202004-08走行距離

202004-08走行距離のメモ

run

  • 4月 68km
  • 5月 13.2km
  • 6月 26.3km
  • 7月 49.8km
  • 8月 0

bike

  • 4月 162.5km
  • 5月 324.7km
  • 6月 152.9km
  • 7月 140.9km
  • 8月 220kmぐらい

7月は雨で自転車こげずrun が多かったがようやく自転車こげるようになってきた。
5月なんでこんなに自転車漕いでるんだ?と思ったらGWに毎朝ポタポタ走っていたからであった。時間があったんだな。
ようやく膝の痛みも収まってきたのでこれから走れる。

2020/07-08読書

一旦現在読んでいる本。読もうとしている本をまとめる

着手済み

  • 努力する人間になってはいけない―学校と仕事と社会の新人論 | 芦田宏直 |本 | 通販 | Amazon
    教育系・哲学系の芦田さんの書。タイトルが衝撃的であるが、本質的には努力を一番の目的としてはいけないよ。といった方向性の話。 「努力主義はエゴイズム」など。 まえがきの「先生、先生」と言われ続けると大体がバカになるというのも面白い。今後の学校教育はどのようになっていくのだろうか?と考えさせられる 日常の話の中から、筆者の考えや視点が散りばめられ、色々な気づきの契機となるようなネタが多い。 印象に残った話としては、一流とはなにか、できるだけ大きな企業を目指しなさい、読書とはなにか、予備校営業が突然家にやってきた、なぜ人を殺してはいけないのか、学校教育の意味とはなにか、など。

  • Amazon.co.jp: グロービス流 キャリアをつくる技術と戦略 eBook: グロービス経営大学院: Kindleストア
    グロービスの方によるキャリアに関する書籍。 キャリアだけというよりも人生における役割にも言及。あなたの人生の中でどの期間に何を重視(時間を使うか)するかを考えるべきというような話が体系立てられて記載されている。 カテゴリや特性分類などがあり自己分析の一助となりそう。就活の時期を思い出すような内容ではある。 具体的にキャリアを築いてきた人の例などの記述もあり

  • 子供のための哲学
    子どもと書いてあるが子ども向けというわけではない。 なぜぼくは存在するのか、なぜ悪いことをしてはいけないのか、という哲学的な問いに対して平易な表現で深堀りをしていっている。 ただし、中身は独我論も含め説明があり、簡単に理解できるものとは言い難い。

  • 三体
    最近話題の書。確かに壮大かつおもしろいSF

未読

Pythonコードスニペット 自分用メモ

メモ書きです。

四則演算基本

>>> x = 123
>>> x % 10
3

while x != 0:
    pop = x %10 # 下一桁がpop
    x  = int(x / 10) # 下一桁を削った数字になる
    rev = rev * 10 + pop 

配列逆順

>>> test[::-1]
'edcba'

reversed(range(len(strx))
sorted(alist, reverse=True)

Python3.5 Type Hints機能

https://www.python.org/dev/peps/pep-0484/#abstract

これは型に関する注釈(型アノテーション)をつけることができる仕様

def greeting(name: str) -> str:
    return 'Hello ' + name

name: str: 引数nameが、str型であることをアノテート
-> str: 関数greetingの返り値の型がstrであることをアノテート
引用元: Pythonではじまる、型のある世界 - Qiita

csv からJSON への変換

import csv,json
import pandas as pd

df = pd.read_csv('testdata.csv',encoding="utf-8")
print(df)
json = df.to_json(orient="records",force_ascii=False)
print(json)

local file のタイムスタンプ取得方法

def get_localmtime(file_names):
    local_mtime = {}
    for names in file_names:
        time = datetime.datetime.fromtimestamp(os.stat(names).st_mtime)
        local_mtime[names] = time.strftime('%Y-%m-%d')
    return local_mtime

とあるWeb サイトのserver indexから日付部分を抽出

def get_servermtime():
    server_mtime = {}
    df_list = pd.read_html('http://192.168.48.130/testdir1/')
    r = re.compile('\d{4}-\d{2}-\d{2}')
    for i in range(2,len(df_list[0])):
        server_mtime[df_list[0][1][i]] = r.search(df_list[0][2][i]).group(0)
    return server_mtime

zip ファイルとして保存

r  =requests.get('http://xxxxx.zip')
with open('xxxx.zip','bw') as file:
    file.write(r.content)    

メール送信

def mail_send(message):
    jp = 'iso-2022-jp'
    msg = MIMEText(message, 'Plain', jp)
    print(msg)

    msg['Subject'] = 'This is test Subject'
    msg['To'] = 'xxxxxx@gmail.com'
    msg['From'] = 'xxxxx@gmail.com'
    try:
        server = smtplib.SMTP('192.168.48.130')
        server.send_message(msg)
    except Exception as e:
        print(str(e))

外部コマンドの実行

res = subprocess.run('ls -l',stdout=subprocess.PIPE)
print(res.stdout.decode('utf-8'))

データ処理

import re
import collections
import glob

filenames = glob.glob('*.iptables.log')
result = []
for file in filenames:
    with open(file,'r') as fileout:
        pattern = 'SRC=(\d+\.\d+\.\d+\.\d+).+DPT=(\d+)\s'
        group = re.findall(pattern,fileout.read())
        for data in group:
            result.append(data)

uniq = collections.Counter(result)
for key,value in uniq.most_common():
    print("\t".join(key)+"\t"+str(value))

syslog テスト

from logging import getLogger, DEBUG
from logging.handlers import SysLogHandler

def _hoge():

    my_logger = getLogger('MyLogger')
    my_logger.setLevel(DEBUG)

    handler = SysLogHandler(address = ('localhost', 514))
    my_logger.addHandler(handler)

    my_logger.debug('this is debug')
    my_logger.critical('this is critical')

if __name__ == "__main__":
    _hoge()

アメリカの2020年大統領選

日本ではあまり話題になっていないアメリカの2020年大統領選について少しメモ。

ちなみに日本の安倍首相は65歳。トランプ大統領73歳 なんだか最近の政治家は年寄りばかりな気がする。。若者がいなくなったのか年寄りが元気なのか。 House of cardsまだ見終わってないから見なくては。