システムデザイン

Ansibleによるリモートサーバでのユーザ設定

*本記事は旧TechblogからCOLORSに統合した記事です。

目次

1. 自己紹介

2018年9月に中途入社しましたS.Gと申します。
はじめに、自身の経歴を簡単に紹介させていただきます。

前職では主に、ハードウェア系とネットワーク運用の業務をしていました。
同じIT系という職種の中にはいながらも、プログラミングの経験は、ほぼありませんでした。

定型的な業務の中で新たなスキルが身につかず、
将来的に活かせる開発スキルを身に着けたいと考え、転職活動に至りました。

転職活動の中で m/fieldを見つけ、研修制度が用意されていることを知り、
開発実務未経験の自分でもスキルが身につくかもしれないと思い、入社を決めました。

下記に自分が m/fieldに入社してから実際に行った研修の内容をご紹介いたします。

2. 研修について

研修では、pythonをメインに学習を進めました。
また、次期案件の参画に必要となるAnsibleを学習しました。

  • Python基礎とPython資格取得
  • 実務向けPythonコーディング
  • Ansible基礎

前職でネットワークの知識を身に着けていたこともあり、次期案件ではネットワーク絡みの案件に
携わることになりました。

そこで、ネットワーク機器にも対応できる構成管理自動化ツールのAnsibleを使って、
リモートサーバの設定をする方法について学習しました。

当記事では、Ansibleに関する学習の中で行った、Ansibleを使ってのリモートサーバのユーザ設定、
また、学習するにあたり、その学習環境の構築も自ら実施したので、その手順についても記載します。

3. Ansible環境構築方法の紹介

3.1. Ansibleとは

Ansible

まずはじめに、Ansibleとは何かということについて簡単に説明します。

構成管理ツールの一つで、システムの初期設定や運用中の構成管理をできるツールです。

アプリケーションをサーバにデプロイしたり、リソースを管理することができます。

実務では今回紹介しないAnsibleコマンドを用いてユーザの設定のみでなく、
インストールパッケージをWebサーバからダウンロードして展開、
設定作業などをしたりサービスの立ち上げなども実施できます。

Ansibleには冪等性という特性があり、サーバに変更を加えるとき、
既に適用する変更の状態になっている場合には変更を実施しません。
冪等性のない場合、例えばユーザを作成しようとするとき、
作成するユーザが存在している状態で同じユーザを作成すると
エラーが発生し、それ以降の処理が中断する可能性がありますが、
冪等性があるツールであればユーザ作成そのものを実施しないのでエラーが発生せず、
以降の処理が継続できます。

Ansibleはエージェントレスのプッシュ型の構成管理ツールで、
管理対象のサーバにエージェントのインストールが不要です。
これは、運用サーバにサービス外のツールをインストールを導入する必要がないという点で
メリットになります。

3.2. 学習環境構築

今回はAnsibleを用いて、下記図 本番・開発ホストへユーザ設定を実行します。

構築する環境

今回準備した環境は以下の通りです。

  • Windows10 Pro 64bit
  • Vagrant 2.1.4
  • VirtualBox 5.2.18
  • CentOS7.2

Ansibleについて学習するために、下記5台のホストを仮想環境に構築しました。

管理ホストからAnsibleを使って開発ホストへユーザを作成し、SSH公開鍵でログインできるようにします。
そして、同様の設定を本番ホストへも設定します。
設定の際、開発/本番ホストへのローカルログインはせず、設定操作を管理ホストからAnsibleを使って操作します。

Ansible

仮想環境に構築するホストのホスト名とIPアドレスの組み合わせは以下の通りです。

  ホスト名 IPアドレス
管理ホスト Management 192.168.10.10
本番ホスト Product-host1 192.168.10.20
Product-host2 192.168.10.30
開発ホスト Develop-host1 192.168.10.40
Develop-host2 192.168.10.50

学習環境構築の主な手順は以下の通りです。

  1. VirtualBox + Vagrantのインストール
  2. Vagrant環境設定
  3. 管理ホスト初期設定

3.2.1. VirtualBox + Vagrantのインストール

VirtualBox + Vagrantは下記から必要なものをダウンロードしてインストールします。

VirtualBox

Vagrant

3.2.2. Vagrant環境設定

カレントディレクトリに仮想環境の設定を記述するVagrantfileを作成します。
Windowsコマンドプロンプトで、仮想環境を起動したいディレクトリを作成・移動してコマンド実行します。

[code lang="ruby"]
vagrant init</pre><div class="hcb_wrap"><pre class="prism undefined-numbers lang-plane" data-lang="コードブロック"><code>/* Your code... */</code></pre></div><pre>[/code]

使用したいOSは Vagrantbox.es から選定しました。
今回はCentOS7.2を使用しました。

vagrant boxへOSを追加します。

[code lang="ruby"]
vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
[/code]

Vagrantfileをテキストエディタで開いて編集します。

今回は下記の設定をしました。

[code lang="ruby"]
Vagrant.configure("2") do |config|

# 管理ホスト
config.vm.define "Management" do |node|
node.vm.box = "centos7.2"
node.vm.hostname = "Management"
node.vm.network :private_network, ip: "192.168.10.10"
end

# 本番ホスト
config.vm.define "Product-host1" do |node|
node.vm.box = "centos7.2"
node.vm.hostname = "Product-host1"
node.vm.network :private_network, ip: "192.168.10.20"
end
config.vm.define "Product-host2" do |node|
node.vm.box = "centos7.2"
node.vm.hostname = "Product-host2"
node.vm.network :private_network, ip: "192.168.10.30"
end

# 開発ホスト
config.vm.define "Develop-host1" do |node|
node.vm.box = "centos7.2"
node.vm.hostname = "Develop-host1"
node.vm.network :private_network, ip: "192.168.10.40"
end
config.vm.define "Develop-host2" do |node|
node.vm.box = "centos7.2"
node.vm.hostname = "Develop-host2"
node.vm.network :private_network, ip: "192.168.10.50"
end

# タイムアウト時間設定
config.vm.boot_timeout = 600

end
[/code]

PCスペックによっては仮想マシン起動に時間がかかるため、タイムアウト時間を延長しています。

仮想マシンを起動します。

[code lang="text"]
vagrant up
[/code]

管理ホストにログインします。

[code lang="ruby"]
vagrant ssh Management
[/code]

備考
・仮想マシン起動:vagrant up (ホスト名、省略時全台)
・仮想マシンログイン:vagrant ssh (ホスト名、省略時全台)
・仮想マシン停止:vagrant halt (ホスト名、省略時全台)
・仮想マシン再起動:vagrant reload (ホスト名、省略時全台)
・仮想マシンの破棄:vagrant destroy (ホスト名、省略時全台)

3.2.3. 管理ホスト初期設定

管理ホストへログインしたら、デフォルトで作成されているユーザを使用し続けるのはよろしくないので、
新規ユーザを作成します。
新規ユーザにはパスワードを設定し、sudoコマンドの実行権限を与えます。

[code lang="text"]
[vagrant@Management ~]$
[vagrant@Management ~]$ su -                       # vagrantにデフォルトログインするので、rootに切り替える。
Password: vagrant                                  # パスワードは表示されない
[root@Management ~]#
[root@Management ~]# useradd user                  # 新規ユーザ作成
[root@Management ~]# passwd user                   # ユーザパスワード設定
Changing password for user user.
New password: userpass                             # パスワードは表示されない
BAD PASSWORD: The password contains the user name in some form
Retype new password: userpass                      # 再入力、パスワードは表示されない
passwd: all authentication tokens updated successfully.
[root@Management ~]#
[root@Management ~]# visudo                        # vi /etc/sudoersでもよいが非推奨

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
user    ALL=(ALL)       ALL                        # 追加
[/code]

4. Ansibleを用いての環境構築

環境構築が完了し、管理ホストの初期設定が完了したので、ここからAnsibleについて学習します。

  1. Ansibleインストール
  2. Ansibleコマンドの基本構成
  3. Ansibleコマンドの実行

4.1. Ansibleインストール

管理ホストにAnsibleをインストールします。
Ansibleはpython2.6以上が必要なので確認してからインストールします。

[code lang="text"]
[root@Management ~]# python -V                                        # pythonのバージョン確認
Python 2.7.5
[root@Management ~]#
[root@Management ~]# yum install -y ansible                           # Ansibleインストール

(略)

Installed:
ansible.noarch 0:2.7.0-1.el7

Dependency Installed:
PyYAML.x86_64 0:3.10-11.el7                                         libtomcrypt.x86_64 0:1.17-26.el7
libtommath.x86_64 0:0.42.0-6.el7                                    libyaml.x86_64 0:0.1.4-11.el7_0
python-babel.noarch 0:0.9.6-8.el7                                   python-backports.x86_64 0:1.0-8.el7
python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7          python-cffi.x86_64 0:1.6.0-5.el7
python-enum34.noarch 0:1.0.4-1.el7                                  python-httplib2.noarch 0:0.9.2-1.el7
python-idna.noarch 0:2.4-1.el7                                      python-ipaddress.noarch 0:1.0.16-2.el7
python-jinja2.noarch 0:2.7.2-2.el7                                  python-keyczar.noarch 0:0.71c-2.el7
python-markupsafe.x86_64 0:0.11-10.el7                              python-paramiko.noarch 0:2.1.1-4.el7
python-ply.noarch 0:3.4-11.el7                                      python-pycparser.noarch 0:2.14-1.el7
python-setuptools.noarch 0:0.9.8-7.el7                              python-six.noarch 0:1.9.0-2.el7
python2-crypto.x86_64 0:2.6.1-15.el7                                python2-cryptography.x86_64 0:1.7.2-2.el7
python2-jmespath.noarch 0:0.9.0-3.el7                               python2-pyasn1.noarch 0:0.1.9-7.el7
sshpass.x86_64 0:1.06-2.el7

Dependency Updated:
openssl.x86_64 1:1.0.2k-12.el7                           openssl-libs.x86_64 1:1.0.2k-12.el7

Complete!
[root@Management ~]#
[root@Management ~]# ansible --version                                # インストール後、バージョンを確認
ansible 2.7.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /bin/ansible
python version = 2.7.5 (default, Nov 20 2015, 02:00:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)]
[root@Management ~]#
[/code]

インストールが完了したら、rootで作業を続けることは好ましくないので、作成したユーザへ切り替えて作業をします。

[code lang="text"]
[root@Management ~]# su - user
[user@Management ~]$
[/code]

4.2. Ansibleコマンドの説明

Ansibleを実行するコマンドの基本構成について学習しました。

ansible ホスト -m 実行コマンド

ansible ホスト -m 実行コマンド -a コマンド引数

ansible ホスト -i インベントリファイル -u ユーザ -k -b -K -m 実行コマンド -a コマンド引数

引数の意味

  • ホスト:

    コマンドを実行する対象ホスト(IPアドレス、ホスト名、グループ、all)
    対象ホストは、インベントリファイルに対象が記述されている必要があります。
    デフォルトインベントリファイル:/etc/ansible/hosts

    インベントリファイル記述例:

    192.168.10.20                        # IPアドレスのみ記載
    Product-host2                        # ホスト名のみ記述
    [Develop-hosts]                      # グループ名記述
    192.168.10.40                        # グループ内にIPアドレス記述
    Develop-host2                        # グループ内にホスト名記述
    

    インベントリファイルにホスト名で記述されている場合は、
    OSのhostsファイル(/etc/hosts)やDNSで名前解決される必要があります。
    ホストにグループ名を指定した場合、インベントリファイルのグループ名以降に
    記述されているホストすべてに実行されます。
    allを指定すると、インベントリファイルに記述されているすべてのホストに実行されます。
    複数指定時はカンマ(,)で区切ります。

  • -i インベントリファイル:

    デフォルトインベントリファイル以外のインベントリファイルを指定する場合に用います。
    インベントリファイル名を inventoryで作成した場合、ディレクトリ名を指定すれば、
    そのディレクトリ直下のインベントリファイルを使用します。
    例:
    ./Develop/inventory をインベントリファイルとして記述した場合、
    -i ./Develop と指定すればインベントリファイルとして使用します。

  • -u ユーザ:

    ターゲットホスト側でコマンドを実行するユーザを指定します。
    省略時は、管理ホストでAnsibleコマンドを実行したユーザ名と同名のユーザ名で実行されます。
    ターゲットホストに該当するユーザ名がない場合、エラーとなります。

  • -k:

    ターゲットホストでSSHパスワード認証が必要な場合に、パスワード入力プロンプトを表示します。
    SSHキー認証方式なら省略可。SSHパスワード認証が必要な場合に省略するとエラーが発生します。

  • -b:

    ターゲットホストでのコマンド実行に、suやsudoによる権限昇格をします。
    権限昇格が必要なコマンドで省略するとエラーが発生します。

  • -K:

    ターゲットホストでのコマンド実行に、suやsudoによる権限昇格を行う場合に、
    権限昇格パスワード入力プロンプトを表示します。
    権限昇格パスワードが必要な場合に省略するとエラーが発生します。

  • -m:

    ターゲットホストで実行するコマンドを指定します。

  • -a:

    ターゲットホストで実行するコマンドに、引数を指定します。

4.3. Ansibleコマンドの実行

ここでは、Ansibleコマンドを用いて実際にリモートホストへコマンドを実行します。
その前に、通信対象のホストをインベントリファイルに記述する必要があるので、記述します。
また、ホスト名を指定して通信ができることも確認するので、OSのhostsファイルへもホスト名、
IPアドレスを記述します。

始めて通信を試みるホストへの通信時、管理ホストのknown_hostsへのSSHキーの登録を聞かれるので、
yesと答えます。
初回接続時に -kオプションを指定していると、キー登録ができず、エラーが発生します。

[code lang="text"]
# SSHキー登録メッセージ
[user@Management ~]$ ansible 192.168.10.20 -m ping               # Ansibleでコマンドを実行
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64.
Are you sure you want to continue connecting (yes/no)? yes       # SSHキーの登録を聞かれるので yes

# インベントリファイル準備
[user@Management ~]$ vi ./Product/inventory                      # 本番ホストのインベントリファイル
192.168.10.20
Product-host2

[user@Management ~]$ vi ./Develop/inventory                      # 開発ホストのインベントリファイル
[Develop-hosts]
192.168.10.40
Develop-host2

# OSのhostsファイル準備
[user@Management ~]$ sudo vi /etc/hosts
192.168.10.30   Product-host2
192.168.10.50   Develop-host2
[/code]

・pingコマンド

インベントリファイルの準備も整ったので、pingコマンドを用いて、リモートホストへの接続確認をします。

Developインベントリファイルを参照して、Develop-hostsグループへping
ansible Develop-hosts -i Develop -u root -k -m ping

Productインベントリファイルを参照して、全てのホストへping
ansible all -i Product -u root -k -m ping

[code lang="text"]
[user@Management ~]$ ansible Develop-hosts -i Develop -u root -k -m ping
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
Develop-host2 | SUCCESS => {                                     # SUCCESS 実行成功
"changed": false,
"ping": "pong"
}
192.168.10.40 | SUCCESS => {                                     # SUCCESS 実行成功
"changed": false,
"ping": "pong"
}
[user@Management ~]$
[user@Management ~]$ ansible all -i Product -u root -k -m ping
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
Product-host2 | SUCCESS => {                                     # SUCCESS 実行成功
"changed": false,
"ping": "pong"
}
192.168.10.20 | SUCCESS => {                                     # SUCCESS 実行成功
"changed": false,
"ping": "pong"
}
[user@Management ~]$
[/code]

・commandコマンド

ターゲットホストでコマンドを実行します。-aオプションで指定したコマンドを実行します。

Developインベントリファイルを参照して、IPアドレス指定で実行
ansible 192.168.10.40 -i Develop -u root -k -m command -a "hostname"

Developインベントリファイルを参照して、ホスト名指定で実行
ansible Develop-host2 -i Develop -u root -k -m command -a "whoami"

[code lang="text"]
[user@Management ~]$ ansible 192.168.10.40 -i Develop -u root -k -m command -a "hostname"
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
192.168.10.40 | CHANGED | rc=0 >>
Develop-host1                                                    # コマンド実行結果

[user@Management ~]$
[user@Management ~]$ ansible Develop-host2 -i Develop -u root -k -m command -a "whoami"
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
Develop-host2 | CHANGED | rc=0 >>
root                                                             # コマンド実行結果

[user@Management ~]$
[/code]

・shellコマンド

commandと同様にターゲットホストでコマンドを実行します。
shellコマンドではパイプやリダイレクションを使用することもできます。
-aオプションで指定したコマンドを実行します。

ansible 192.168.10.40 -i Develop -u root -k -m shell -a "ls -al /root | grep bash"

[code lang="text"]
[user@Management ~]$ ansible 192.168.10.40 -i Develop -u root -k -m shell -a "ls -al /root | grep bash"
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
192.168.10.40 | CHANGED | rc=0 >>
-rw-------   1 root root   84 Oct 17 09:21 .bash_history         # コマンド実行結果
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc

[user@Management ~]$
[/code]

・userコマンド

ターゲットホストでユーザの管理をします。

192.168.10.40の開発ホストに、user という名前のユーザを作成します。

ansible 192.168.10.40 -i Develop -u root -k -m user -a "name=user state=present"

[code lang="text"]
[user@Management ~]$ ansible 192.168.10.40 -i Develop -u root -k -m user -a "name=user state=present"
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
192.168.10.40 | CHANGED => {
"changed": true,                                             # コマンド実行結果
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/user",
"name": "user",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
[user@Management ~]$
[/code]

作成したユーザを削除します。
引数のstateに absentを指定します。removeにyesを指定すると、ホームディレクトリも削除します。

ansible 192.168.10.40 -i Develop -u root -k -m user -a "name=user state=absent remove=yes"

[code lang="text"]
[user@Management ~]$ ansible 192.168.10.40 -i Develop -u root -k -m user -a "name=user state=absent remove=yes"
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
192.168.10.40 | CHANGED => {
"changed": true,                                             # コマンド実行結果
"force": false,
"name": "user",
"remove": false,
"state": "absent"
}
[user@Management ~]$
[/code]

・その他のコマンド

  • lineinfileコマンド:ファイルの行の編集をする。
  • authorized_keyコマンド:SSH公開鍵を特定のユーザアカウントに登録/削除をする。
  • yum(apt)コマンド:パッケージをインストールする。
  • serviceコマンド:サービスの起動や停止をする。
  • get_urlコマンド:Webサーバからファイルをダウンロードする。
  • unarchiveコマンド:管理ホストからアーカイブファイルを転送し展開する。
  • scriptコマンド:管理ホストからスクリプトファイルを転送して実行する。

上記以外にも、DockerやOpenStack、Cisco機器向けのコマンドも開発されており、様々なシステムの構成管理に適応できます。

5. Ansible-Playbook

ここまでは1つのAnsibleコマンドで1つの命令のみを実行できることを学習しましたが、
Playbookというものを使用することで一連の命令を記述することができます。

  1. Playbookの基本構成
  2. 事前準備
  3. Playbook作成
  4. Playbook実行
  5. 本番ホストへのPlaybook実行

5.1. Playbookの基本構成

PlaybookはYAMLという形式で記述します。

[code lang="text"]
---                                            # ファイルの先頭を示す
- hosts: 192.168.10.40                        # 一つ目の実行ホストの指定
remote_user: root                           # 実行ユーザの指定、実行コマンドの -u オプションでも可
become: yes                                 # sudoでの実行が必要なコマンドを許可する、実行コマンドの -b でも可
# -Kオプションでsudoパスワード入力プロンプトを表示させる必要がある
tasks:                                      # ホストに対して一連のコマンドを実行する処理
- name: TASK 1                            # 一つ目のコマンド実行処理のタスク名
command: echo 'Hello World'             # 一つ目の実行コマンド
- name: TASK 2                            # 二つ目のコマンド実行処理のタスク名
user: name=user password=...            # 二つ目の実行コマンド
:
:
- hosts: 192.168.10.50                        # 二つ目の実行ホストの指定
:
:
[/code]

5.2. 事前準備

開発ホストへユーザを作成するにあたり、パスワードを暗号化するためのPythonコマンドを管理ホストにインストールします。
管理ホストでpipがインストールされていなければ、それもインストールします。

yum install -y python-pip

暗号化コマンドインストール

pip install passlib

5.3. Playbook作成

ユーザを作成し、sudo実行権限を与えるPlaybook(user_setting.yml)

[code lang="text"]
---
- hosts: all                                                   # インベントリファイルのすべてのホストを指定
vars_prompt:                                                 # 入力を求めるプロンプトを表示
- name: input_pass                                         # 入力値を格納する変数
prompt: input user password                              # プロンプトに表示する文字列
private: yes                                             # 入力値を画面に表示しない
encrypt: sha512_crypt                                    # 暗号化タイプ
confirm: yes                                             # 入力値の確認(再入力)を要求する
salt_size: 8                                             # 入力値に付与して暗号化する数値
tasks:
- name: Create User
user: name=user password={{ input_pass }} state=present  # 新規ユーザを作成する
# ユーザ名:user
# パスワード:入力値
# state:present(作成)、absent(削除)
- name: User sudoers
lineinfile: dest=/etc/sudoers line='user ALL=(ALL) ALL'  # /etc/sudoersファイルを編集
# userにsudo実行権限を与える。
[/code]

hostsで指定したホスト(IPアドレス、ホスト名、グループ名、all)に対してPlaybookを実行します。
vars_promptで値の入力を要求し、値を暗号化しています。
2つのタスクを作成し userコマンドで新規ユーザの作成と暗号化したパスワードを設定。
lineinfileコマンドで /etc/sudoersファイルを編集して、新規作成したユーザにsudo実行権限を与えています。

5.4. Playbook実行

Playbookは、ansible-playbookコマンドで実行します。
オプションの意味はansibleコマンドと同様で、実行するPlaybookファイルを指定して実行します。
コマンド実行前に –syntax-checkオプションでPlaybookが正しい書式か確認してから実行します。

[code lang="text"]
[user@Management ~]$ ansible-playbook -i Develop -u root -k user_setting.yml --syntax-check
# 書式チェックオプション

playbook: user_setting.yml                                       # 問題なければPlaybookファイル名のみ表示されます。
[user@Management ~]$ ansible-playbook -i Develop -u root -k user_setting.yml
SSH password: vagrant                                            # SSHパスワード認証、パスワードを入力してください。
input user password: userpass                                    # このユーザに設定するパスワードを入力します。
confirm input user password: userpass                            # このユーザに設定するパスワードを再入力します。

PLAY [all] **********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.10.40]
ok: [Develop-host2]

TASK [Create User] **************************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

TASK [User sudoers] *************************************************************************************************
changed: [Develop-host2]
changed: [192.168.10.40]

PLAY RECAP **********************************************************************************************************
192.168.10.40              : ok=3    changed=2    unreachable=0    failed=0
Develop-host2              : ok=3    changed=2    unreachable=0    failed=0
[/code]

続いて、作成したユーザにSSH公開鍵でログインできるようにして、ホストにSSHパスワード認証で接続できなくします。

SSH公開鍵の転送、SSHパスワード認証を無効、SSHサービスを再起動するPlaybook(root_lock.yml)

[code lang="text"]
---
- hosts: all
tasks:
- name: ssh public key sending
authorized_key: user=user key={{ lookup('file','/home/user/.ssh/id_rsa.pub') }}
- name: root password disable
lineinfile: dest=/etc/ssh/sshd_config regexp='^PasswordAuthentication' line='PasswordAuthentication no'
- name: ssh service restart
service: name=sshd state=restarted
[/code]

作成したPlaybookを実行します。
その前に管理ホストでSSHキーペアを作成してからPlaybookを実行します。
user からコマンド実行するので、先程までは -uオプションで rootを指定して実行していましたが、
今回は指定せずに実行します。
代わりに userがsudo権限昇格を行うために、-b と -Kオプションを使用します。

[code lang="text"]
[user@Management ~]$ ssh-keygen                                     # SSHキーペア作成コマンド
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):       # 今回は何も入力しない
Enter passphrase (empty for no passphrase):                         # 今回は何も入力しない
Enter same passphrase again:                                        # 今回は何も入力しない

(略)

[user@Management ~]$
[user@Management ~]$ ansible-playbook -i Develop -k -b -K root_lock.yml      # Playbook実行
SSH password: userpass                                              # SSHパスワード認証、パスワードを入力してください。
SUDO password[defaults to SSH password]: userpass                   # sudoパスワード入力

PLAY [all] *************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [Develop-host2]
ok: [192.168.10.40]

TASK [ssh public key sending] ******************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

TASK [root password disable] *******************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

TASK [ssh service restart] *********************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

PLAY RECAP *************************************************************************************************************
192.168.10.40              : ok=4    changed=3    unreachable=0    failed=0
Develop-host2              : ok=4    changed=3    unreachable=0    failed=0

[user@Management ~]$
[/code]

開発ホストへユーザを作成しSSH公開鍵でログインできるようにし、パスワード認証を無効にすることができました。
これで目的としていたユーザ作成と設定変更が完了です。

本番ホストへユーザの作成

[code lang="text"]
[user@Management ~]$ ssh-keygen                                     # SSHキーペア作成コマンド
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):       # 今回は何も入力しない
Enter passphrase (empty for no passphrase):                         # 今回は何も入力しない
Enter same passphrase again:                                        # 今回は何も入力しない

(略)

[user@Management ~]$
[user@Management ~]$ ansible-playbook -i Develop -k -b -K root_lock.yml      # Playbook実行
SSH password: userpass                                              # SSHパスワード認証、パスワードを入力してください。
SUDO password[defaults to SSH password]: userpass                   # sudoパスワード入力

PLAY [all] *************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [Develop-host2]
ok: [192.168.10.40]

TASK [ssh public key sending] ******************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

TASK [root password disable] *******************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

TASK [ssh service restart] *********************************************************************************************
changed: [192.168.10.40]
changed: [Develop-host2]

PLAY RECAP *************************************************************************************************************
192.168.10.40              : ok=4    changed=3    unreachable=0    failed=0
Develop-host2              : ok=4    changed=3    unreachable=0    failed=0

[user@Management ~]$
[/code]

開発ホストへ実行した設定が、本番ホストへも実行できることを確認します。

Playbook実行時に -iオプションで指定していたインベントリファイルを、
本番ホストのインベントリファイルへ変更するのみで本番ホストへ設定をすることができます。

本番ホストへSSH公開鍵登録とパスワード認証無効化

[code lang="text"]
[user@Management ~]$ ansible-playbook -i Product -k -b -K root_lock.yml
SSH password: userpass                                           # SSHパスワード認証、パスワードを入力してください。
SUDO password[defaults to SSH password]: userpass                # sudoパスワード入力

PLAY [all] *************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.10.20]
ok: [Product-host2]

TASK [ssh public key sending] ******************************************************************************************
changed: [192.168.10.20]
changed: [Product-host2]

TASK [root password disable] *******************************************************************************************
changed: [Product-host2]
changed: [192.168.10.20]

TASK [ssh service restart] *********************************************************************************************
changed: [Product-host2]
changed: [192.168.10.20]

PLAY RECAP *************************************************************************************************************
192.168.10.20              : ok=4    changed=3    unreachable=0    failed=0
Product-host2              : ok=4    changed=3    unreachable=0    failed=0

[user@Management ~]$

[/code]

インベントリファイルを切り替えることで、開発ホストと同様の設定を本番ホストへも設定することができました。

6. まとめ

今回 m-fieldに入社して受けた研修では、
前職でのネットワークの経験を活かしながら、PythonプログラミングやAnsibleに対する
理解につなぐことができました。
技術を組み合わせながら学習することは、今後のスキル習得にも活かしていけると思います。

m-fieldの研修では、研修指導者がすぐそばにいてくれるので、わからないことがあればすぐに
質問をすることができ、
わからないことをしっかり理解して実務に挑むことができます。