できる!kickstartとansible!
TRANSCRIPT
できる!KickstartとAnsible!
(株)ユニキャストソフトウェアエンジニア 野口航
UniStudy#1 フリースタイル LT @日立市
お前誰? : 野口航 (@wnoguchi)
しがないソフトウェアエンジニア( 29 歳) 茨城県日立市在住 「最近太った?」とよく言われるようになった DevOps へ取組み 株式会社ユニキャスト所属 シェアハウス「コクリエ」に居住 通勤 15 秒 夢はユーザ企業、とうきょうぐらし!
もくじ 自動化するモチベーション Kickstart とは Kickstart してみる 構成管理ツールとは Ansible とは Ansible してみる
インフラの構築を自動化するモチベーション 物理サーバが増える 毎回同じ手順 仮想マシンもどんどん増える Hadoop に代表されるビッグデータを扱うものでは同じような IA サーバをたくさん( 100 台単位とか)用意する 人がまともにやると過労になる 手順書だとミスも増える
Kickstartとは
RHEL 系 OS のインストールを自動化するツール Debian 系は Preseed が有名 私の Preseed 記事結構有名なので良かったら見てね★
Preseed による Ubuntu の自動インストール入門 – Qiitahttp://goo.gl/s6SavA
Kickstartしてみる (cont.)
ISO をマウントmount -o loop /var/tmp/CentOS-7-x86_64-Minimal-1503-01.iso /mnt/media/centosDVD の中身をすべてコピーfind /var/tmp/CentOS-7-x86_64-Minimal-1503-01.iso /mnt/media/centos -maxdepth 1 -mindepth 1 -exec cp -rp {} /var/tmp/CentOS-7-x86_64-Minimal-1503-01-ks \;
Kickstartしてみる (cont.)
timeout 50
label linux menu label ^Install CentOS 7 kernel vmlinuz menu default append initrd=initrd.img inst.stage2=cdrom inst.text inst.ks=http://192.168.0.10/ks.cfg
Kickstart の構成ファイルを外に定義するvim isolinux/isolinux.cfg
Kickstartしてみる (cont.)
sudo cp /vagrant/ks.cfg /var/tmp/CentOS-7-x86_64-Minimal-1503-01-ks
mkisofs -v -r -J -o /var/tmp/CentOS-7-x86_64-Minimal-1503-01-ks.iso \ -b isolinux/isolinux.bin \ -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ /var/tmp/CentOS-7-x86_64-Minimal-1503-01-ks
sudo cp /var/tmp/CentOS-7-x86_64-Minimal-1503-01-ks.iso /vagrant
ISO イメージを錬成
錬金術 - Wikipediahttps://goo.gl/uYXiag
Kickstartしてみる (cont.)
auth --enableshadow --passalgo=sha512
# Use CDROM installation mediacdrom# Use graphical installtext# Run the Setup Agent on first bootfirstboot --enableignoredisk --only-use=sda# Keyboard layoutskeyboard --vckeymap=jp --xlayouts='jp'# System languagelang ja_JP.UTF-8firewall --disabledselinux --disabled
# Accept Eulaeula --agreedreboot --eject
# Network information# Intranetwork --bootproto=static --device=enp0s25 --gateway=192.168.0.1 --ip=192.168.0.120 --nameserver=8.8.8.8,8.8.4.4 --netmask=255.255.255.0 --ipv6=auto --activate --hostname=phy1.pg1x.internal# Root passwordrootpw --iscrypted blahblahblah# System servicesservices --enabled="chronyd"# System timezonetimezone Asia/Tokyo --isUtc --ntpservers=0.centos.pool.ntp.org,1.centos.pool.ntp.org,2.centos.pool.ntp.org,3.centos.pool.ntp.org,ntp.jst.mfeed.ad.jp
Kickstart ファイルサンプル
Kickstartしてみる (cont.)
user --groups=wheel --name=wnoguchi --password=blahblahblah -iscrypted --gecos="wnoguchi"# System bootloader configurationbootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# Partition clearing informationclearpart --all --initlabel --drives=sda
# Disk partitioning informationpart /boot --fstype="xfs" --ondisk=sda --size=500
part pv.241 --fstype="lvmpv" --ondisk=sda --size=1905893
volgroup centos_phy1 --pesize=4096 pv.241
logvol / --fstype="xfs" --size=1899872 --name=root --vgname=centos_phy1
logvol swap --fstype="swap" --size=6016 --name=swap --vgname=centos_phy1
Kickstart ファイルサンプル
Kickstartしてみる (cont.)
%packages@corechronykexec-tools
%end
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
%post --log=/root/post_install.logyum -y update%end
Kickstart ファイルサンプル
Kickstartしてみる (cont.)実行してみよう
Kickstartしてみる (cont.)実行してみよう
Kickstartしてみる実行してみよう
構成管理ツールとは サーバーの状態を管理するツール どんなアプリケーションが入っているかを定義する どのような設定となっているかを定義する DSL で記述したりして Git 等の VCS で差分を管理できる どこを変更したか一目瞭然 GitLab 等のツールでレビューしやすい Chef, Ansible, Puppet 等がある これとは逆に状態を保持しない、壊れることを前提としたコンテナ型のアーキテクチャを Immutable Infrastructure という (Docker, LXC, OpenVZ 等 )
Ansibleとは
Python で書かれたサーバの構成管理を自動化するツール 基本的な最小限のセットアップ(ネットワーク、 SSH 公開鍵のセット、プロビジョニングユーザの作成)は Kickstart でやって、その後のアプリケーションのインストールは Chef, Ansible 等の構成管理ツールにまかせる Python はどのディストリビューションにもデフォルトでインストールされているので、エージェントレスでプロビジョニング可能 Yaml でシンプルに記述可能 Chef Zero (旧 Chef Solo )は Ruby が必要、エージェントのインストール必須なので、本腰を入れて Web サービス等を構築するモチベーションがないとつらい
Ansibleしてみる (cont.)インベントリファイルで実行する対象のホストを定義
vim /etc/ansible/hosts
Ansibleしてみる (cont.)
$ ansible all -a "/bin/date"
単体で実行
すべてのホストに対して同じ命令を書くのに便利
$ ansible all -m yum -a "name=httpd state=present" -s
Ansibleしてみる (cont.)
- hosts: 192.168.33.11# var: remote_user: vagrant sudo: yes tasks: - name: install EPEL Repository yum: name=epel-release state=present - name: install httpd yum: name=httpd state=present - name: install php yum: name=php state=present notify: - restart httpd - name: disable selinux selinux: state=disabled - name: show date command: date handlers: - name: restart httpd service: name=httpd state=restarted
Playbook サンプル ~サーバの構成をまとめて書く~
Ansibleしてみる (cont.)
$ ansible-playbook playbook.yml
サンプル実行
Ansibleしてみる
$ ansible-playbook playbook.yml
冪等性(べきとうせい)の確認
この先のモチベーション
PullRequest がマージされたタイミングで ansible-playbook コマンドを実行すると便利 PullRequest がマージされたタイミングで自動で ISO イメージを作成して特定のサーバ(例えば Amazon S3 とか)に最新のものを置いてくれると便利
Jenkins 先生との融合
ご清聴ありがとうございました。