【Ansible】CentOS7 にインストールしてみた
【結論】
CentOS7にAnsibleをインストする際の手順をまとめた。
viコマンド使えない前提で手順をまとめました。
【目次】
- はじめに
- 前提条件
- Pythonのインストール
- Ansibleのインストール
- SSH公開鍵認証設定
- CentOS 7 で ssh-copy-id ができなかったときの対処法
- ansbile.cfgの設定
- Ansibleでpingを実行する
- 参考情報
- さいごに
はじめに
本記事は『Ansible実践ガイド 第2版』の手順に従って、Ansibleをインストールするハンズオンを行なった際の備忘録です。
AnsibleはPythonで開発されており、かつ管理対象サーバーへはSSHで接続するため、以下の設定を行う必要があります。
現状の私にとって、上記内容はパンドラの箱です。
よって、パンドラの箱は開けずにハンズオンした結果のみをまとめます。
前提条件
Ansibleは複数のサーバーに対する設定を自動で行うためのツールであるため、以下のような構成が一般的です。
しかし、個人でAnsibleを学習するだけなのに2つも仮想環境を用意するのは手間です。 よって以下のような構成にして、自分自身の設定を変更するようにしました。
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 は接続先マシンのパスワードを要求するため、パスワード認証ができないと問答無用でエラーになってしまいます。
対処方法
/etc/ssh/sshd_config の PasswordAuthentication の項目を一旦 yes に変更します。
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 に戻したほうがいいと思います。
ということなので、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のインストールは完了です。
参考情報
CentOS 7 で ssh-copy-id ができなかったときの対処法 - Qiita
ファイルの差分を見る!diffコマンドの詳細まとめ【Linuxコマンド集】
【Linux】シェルスクリプトによる文字列処理:置換や削除をする方法
さいごに
自宅だとやる気が出ないので、カフェでハンズオンしてました。
そこで思ったことは、お酒飲んで酔って翌日頭痛で悩まされるより、ターミナル画面でコマンドを叩いている自分に酔いしれている方が気持ちいなーと思いました。