Ansibleに入門したので勉強したノートをまとめてみる
まえがき
APEXやってレポート書いてバイトしていたらいつの間にか2週間経ってました。
…初回で週1とか言ってたのにね
バイト先でAnsibleを使った勉強会の開催をすることになり、そこで使う資料を作り終えたので、そこから要所要所を抜粋しつつ自分の言葉で落とし込むためにまとめていこうと思います。
Ansibleとは
サーバーやネットワーク機器に対して、あらかじめ用意した設定ファイル(Playbookと呼ぶ)に従って自動で設定やインストールなどを行う構成管理ツール。
Ansibleや設定ファイルを用意する必要はありますが、一度用意してしまえば使いまわすこともできるので、多くのサーバーの設定を行いたいときなどに便利です。
余談
ちなみにこういった手動ではなく自動で構成管理を行うような行為をInfrastructure as Codeというそうです。最近流行ってるらしいですね、あんまり聞いたことないですが業界によるんでしょうか?
IaCについては以下が分かりやすかったです。
IaC(Infrastructure as Code)とは
Ansibleのインストール
AnsibleはPythonを使ったツールです。
dnfでもインストールできるらしいですが、自分はできなかったのでpip3でインストールしました。
インストール手順
$dnf install python3
$python3 -V
Python 3.6.8
$pip3 install ansible
$ansible --version
Playbookとは
Playbookは、ターゲットノードに対する設計書手順のことをいいます。
AnsibleではこのPlaybookをYAMLという書式で記述することになっているのですが、このYAMLの書き方が特殊でちょっとめんどくさいです。
YAMLとは
YAMLが特徴的なのはインデントです。
このインデントをスペース空白2つ分で表します。
注意なのが、
・記述にタブを使うことができないこと
・インデントが間違ってるとエラーを吐くこと
ここが書くときにスペース連打する必要があって面倒です。
実際に使ってみる
Playbookを書いてみる
※␣が全角になっちゃうのでレイアウトぐちゃぐちゃですが半角スペースです
$vi ansible-test.yml
-␣name: Ansible-test
␣␣hosts: localhost
␣␣vars:
␣␣␣␣ansible_become: yes
␣␣␣␣ansible_become_method: sudo
␣␣tasks:
␣␣name: change hostname
␣␣-␣hostname:
␣␣␣␣␣␣name: Ansible-user
文法チェック
Ansibleには文法チェック機能が付いています。
サーバーの変更はシステムに大きな変更を与えることがあるので、実行前に間違った書き方がないかどうかを確認しておきましょう。
$ansible-playbook -i hosts ansible-test.yml --syntax-check
playbook: ansible-test.yml
↑問題がなければ上記のように何も出てこない
テスト実行
実際にどういった挙動が起きるのかを確認することができます。
ここでは実際の実行結果が出力されますが、ターゲットノードには反映されてないので注意です。
PLAY RECAPを見て、すべてokになっていることを確認しましょう。
[admin@tsuna ansible]$ ansible-playbook ansible-test.yml --ask-pass
SSH password:(パスワードを入力)
PLAY [Ansible-test] ************************************************************TASK [Gathering Facts] *********************************************************
ok: [localhost]TASK [change hostname] *********************************************************
changed: [localhost]PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
本番実行
ここまでクリアしていれば、あとは実行するだけです。
[admin@tsuna ansible]$ansible-playbook hosts ansible-test.yml --ask-pass
(checkと一緒なので省略)
確認
ホストネームが変わっていることを確認します。
$hostname
Ansible-user
自分ではなく対象サーバーに実行する
今回の環境
- ホスト:192.168.100.3
- ゲスト:192.168.56.1
Playbook
[root@tsuna ansible]# vi ansible-test2.yml
-␣name: install something
␣␣hosts: server
␣␣vars:
␣␣␣␣ansible_become: yes
␣␣␣␣ansible_become_method: sudo
␣␣tasks:
␣␣-␣name: Install Vsftpd
␣␣␣␣yum:
␣␣␣␣␣␣name: vsftpd
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Ftp
␣␣␣␣yum:
␣␣␣␣␣␣name: ftp
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Chrony
␣␣␣␣yum:
␣␣␣␣␣␣name: chrony
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Httpd
␣␣␣␣yum:
␣␣␣␣␣␣name: httpd
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Php
␣␣␣␣yum:
␣␣␣␣␣␣name: php
␣␣␣␣␣␣state: latest
␣␣-␣name: Install mariadb-server
␣␣␣␣yum:
␣␣␣␣␣␣name: mariadb-server
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Php-mysqlnd ␣␣␣␣yum:
␣␣␣␣␣␣name: php-mysqlnd
␣␣␣␣␣␣state: latest
インベントリ
インベントリとは
Playbookをどのホストノードに対して実行するのかを記述したファイルのことです。
IPアドレスやユーザネーム、パスワードなどを記述します。
自分に対してのときは書かない方がすっきりするので書きませんでしたが、ターゲットノードが存在するときにはごちゃつくので書くことをおすすめします。
インベントリ
[root@tsuna ansible]# vi hosts
[server]
192.168.56.1 ansible-user=root
ちなみに
AnsibleはSSHでターゲットノードの設定を行うのですが、一般的にはパスワード認証ではなく公開鍵認証を使います。
チェック、実行
$ansible-playbook -i hosts ansible-test2.yml --private-key="~/.ssh/id_rsa"
1人用とやってることは同じなので省略します。
公開鍵認証を行う場合にはprivate-keyオプションをつけて秘密鍵のパスを指定してください。
できましたでしょうか?
エラーが起きた場合は以下のサイトなどを参考にしてください。AnsibleはCentOSやその人の環境次第で色々なエラーが起きます。
もともと「空のサーバーに対する環境構築ソフト」、という前提で開発されたものなのかもしれませんね。
おわり
以上です
久々にMarkdown書きましたがやっぱりちょっと書きづらいですね
公開鍵認証については今回省きましたが、理解しているとAnsibleについても理解しやすくなると思います
ちょっとサボってたぶん長めに書きました、ちなみにテスト実行はしてないので間違ってることもあるかもしれません(コメントで訂正くれたら直します )
Ansibleを募集要項に書いてある会社もそこそこあったので、慣れておくと多少有利に働くこともあるかもしれないですね
自分はインターン2社落ちてるのでなんともいえないですが…
では、今回はここで。
2021/05/20追記
なんかもやっとしてたので確認したらエラーが凄かったです、すみません。訂正して色々修正、追記しました。
何を言いたいのかがぐちゃってたので、自分に対してと外に対してで分けることにしました、少しでもわかりやすくなってたら嬉しいです。
参考
ansibleでLinuxユーザーの作成と鍵認証を設定する - Qiita
Amazon.co.jp: Ansible構築・運用ガイドブック インフラ自動化のための現場のノウハウ (Compass Books) eBook: 八木澤 健人: Kindleストア