【Ansible】CentOS7 にインストールしてみた

f:id:hira98:20190707171908p:plain

【結論】

  • CentOS7にAnsibleをインストする際の手順をまとめた。

  • viコマンド使えない前提で手順をまとめました。

【目次】

はじめに

本記事は『Ansible実践ガイド 第2版』の手順に従って、Ansibleをインストールするハンズオンを行なった際の備忘録です。

AnsibleはPythonで開発されており、かつ管理対象サーバーへはSSHで接続するため、以下の設定を行う必要があります。

  • Pythonのvirtualenvの設定

  • SSHの公開鍵認証の設定

現状の私にとって、上記内容はパンドラの箱です。

よって、パンドラの箱は開けずにハンズオンした結果のみをまとめます。

前提条件

Ansibleは複数のサーバーに対する設定を自動で行うためのツールであるため、以下のような構成が一般的です。

f:id:hira98:20190707171938p:plain

しかし、個人でAnsibleを学習するだけなのに2つも仮想環境を用意するのは手間です。 よって以下のような構成にして、自分自身の設定を変更するようにしました。

f:id:hira98:20190707171948p:plain

Pythonのインストール

$ sudo yum install -y epel-release
$ sudo yum groupinstall -y "Development Tools"
$ sudo yum install python-devl sshpass

Ansibleのインストール

# pipの取得
$ curl -KL "https://bootstrap.pypa.io/get-pip.py" | sudo python

# virtualenvモジュールのインストール
$ sudo pip install virtualenv

# 作業フォルダに移動
$ cd ~/

# Python仮想環境の作成
$ virtualenv venv

# 仮想環境の有効化
$ source ~/venv/bin/activate

# 仮想環境へansibleモジュールをインストール 
(venv)$ pip install ansible

# バージョン確認
(venv)$ ansible --version

# virtualenvの無効化
(venv)$ deactivate

SSH公開鍵認証設定

秘密鍵と公開鍵のセットを作成

$ cd ~/home/vagrant
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:AjsaC1hQcZ/WW4YNAxuyU5gZqRPSlYIUHeF7ksc9azY vagrant@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|o*==BB+.o        |
|o.=o*= = =       |
| ..=+ = o +      |
|..o +=.  +       |
|o .=o+.oS        |
| . ++. .o        |
|  o    E         |
|      o .        |
|                 |
+----[SHA256]-----+

次に作成した公開鍵をlocalhostに紐付けます。

~/.ssh/id_rsa.pubで公開鍵を指定しています。

$ ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost

上記コマンド実行時に、Permission denied (publickey,gssapi-keyex,gssapi-with-mic).と出る場合はCentOS 7 で ssh-copy-id ができない時の手順を試してみてください。

CentOS 7 で ssh-copy-id ができなかったときの対処法

原因

以下のようです。

centOS 6 までとは違い、CentOS 7 からはパスワード認証がデフォルトで無効になっているようです。

ssh-copy-id は接続先マシンのパスワードを要求するため、パスワード認証ができないと問答無用でエラーになってしまいます。

引用:CentOS 7 で ssh-copy-id ができなかったときの対処法 - Qiita

対処方法

/etc/ssh/sshd_config の PasswordAuthentication の項目を一旦 yes に変更します。

引用:CentOS 7 で ssh-copy-id ができなかったときの対処法 - Qiita

viを使いこなせていないため、コマンドを駆使して変更してみました。

#ルートユーザーに変更する
$ su

# PasswordAuthenticationがno設定であることを確認する。
$ cat /etc/ssh/sshd_config | grep PasswordAuthentication
#PasswordAuthentication yes
PasswordAuthentication no
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication, then enable this but set PasswordAuthentication

# 設定ファイルのバックアップ取得
$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup
ansible -i ./test01_inventory.ini test_servers -m ping

# 取得したバックアップとの差分がないことを確認
$ diff /etc/ssh/sshd_config /etc/ssh/sshd_config_backup

# 設定を書き換えた、sshd_config_newファイルを作成する。
$ sudo sed -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config > /etc/ssh/sshd_config_new

# 正しく書き換わっているか差分を確認する。
$ diff /etc/ssh/sshd_config /etc/ssh/sshd_config_new

# 元ファイルを設定を書き換えたファイルで上書きする。
$ cp /etc/ssh/sshd_config_new /etc/ssh/sshd_config

# 念の為、バックアップとの差分を確認する。
$ diff /etc/ssh/sshd_config /etc/ssh/sshd_config_backup

# 変更した設定情報を読み込む。
$ systemctl restart sshd

# ルートユーザーからログアウトする
$ exit

設定を元に戻す

※セキュリティの観点から、鍵を送った後は PasswordAuthentication を no に戻したほうがいいと思います。

引用:CentOS 7 で ssh-copy-id ができなかったときの対処法 - Qiita

ということなので、ssh-copy-id実行後に次のコマンドを実行して設定を元に戻します。

#ルートユーザーに変更する
$ su

# PasswordAuthenticationがyesであることを確認する。
$ cat /etc/ssh/sshd_config | grep PasswordAuthentication

# 設定ファイルのバックアップ取得
$ cp /etc/ssh/sshd_config_backup /etc/ssh/sshd_config 

# PasswordAuthenticationがnoであることを確認する。
$ cat /etc/ssh/sshd_config | grep PasswordAuthentication

# ワークファイルの削除
$ rm /etc/ssh/sshd_config_new
$ rm /etc/ssh/sshd_config_backup

# 変更した設定情報を読み込む。
$ systemctl restart sshd

# ルートユーザーからログアウトする
$ exit

ansbile.cfgの設定

Ansiibleの設定ファイル(ansible.cfg)は置く場所によって優先順位が異なり、次の順番でansible.cfgを検索するようになっているそうです。

(1)環境変数にファイルパスをせって(ANSBILE_CONFIG=/usr/local/ansible/conf/ansible.cfg)

(2)カレントディレクトリに存在する設定(./ansbile.cfg)

(3)ホームディレクトリに存在する設定(~/.ansible.cfg)

(4)/etc/ansible/ansible/cfg

引用:『Ansible実践ガイド 第2版』P63

(1)に関してはpipでインストールした際は生成されません。ANSBILE_CONFIGが空であることは、次のコマンドで確認できます。

$ echo $ANSBILE_CONFIG

今回は、『Ansible実践ガイド 第2版』に従い(3)ホームディレクトリに設定します。

.ansible.cfgファイルに設定する内容は以下になります。

[defaults]
forks = 1
log_path = ~/.ansible/ansible.log
host_key_checking = False
gathering = smart

このファイルを、次のコマンドを実行して生成します。

$ cd ~/
$ echo "[defaults]" > .ansible.cfg
$ echo "forks = 1" >> .ansible.cfg
$ echo "log_path = ~/.ansible/ansible.log" >> .ansible.cfg
$ echo "host_key_checking = False" >> .ansible.cfg
$ echo "gathering = smart" >> .ansible.cfg

Ansibleでpingを実行する

ファイルに書いて実行する方法が一般的なのですが、今回は最低限の動作確認ということでコマンドだけで実行してみます。

まず、ansibleモジュールをインストールしたPythonの仮想環境を有効にします。

(これはログイン時に毎回行う必要があります。)

$ source ~/venv/bin/activate

次に、localhostに対してAnsibleのpingモジュールを実行してみます。

$ ansible localhost -m ping
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

SUCCESSが出力されればAnsibleのインストールは完了です。

参考情報

Ansible実践ガイド 第2版 - インプレスブックス

CentOS 7 で ssh-copy-id ができなかったときの対処法 - Qiita

ファイルの差分を見る!diffコマンドの詳細まとめ【Linuxコマンド集】

【Linux】シェルスクリプトによる文字列処理:置換や削除をする方法

さいごに

自宅だとやる気が出ないので、カフェでハンズオンしてました。

そこで思ったことは、お酒飲んで酔って翌日頭痛で悩まされるより、ターミナル画面でコマンドを叩いている自分に酔いしれている方が気持ちいなーと思いました。