Ansibleは、ソフトウェアアプリケーションの展開、クラウドプロビジョニング、および構成管理を自動化するシンプルな自動化ツールです。これは、「コントロールマシン」と呼ばれる単一の場所から多数のサーバーノードを管理および制御するのに役立つサーバーオーケストレーションツールです。 Ansibleは2012年にMichaelDeHaanによって作成され、PythonとPowershellで記述されています。
このチュートリアルでは、自動化ツールAnsibleを使用して、新しいユーザーをデプロイし、SSHキーベースの認証を有効にする方法を学習します。また、Ansibleの「ControlMachine」を構成する方法と、簡単なansibleプレイブックを作成する方法についても学習します。
- 2台以上のUbuntu18.04サーバー
- 10.0.15.10制御マシン
- 10.0.15.21 ansi01
- 10.0.15.22 ansi02
- root権限
何をしますか?
- AnsibleControlMachineのセットアップ
- ユーザーとSSHキーを定義する
- インベントリファイルの作成
- AnsiblePlaybookを作成する
- Playbookを使用してサーバーをデプロイする
- テスト
このチュートリアルでは、Ubuntu16.04サーバーをAnsibleの「マシンコントロール」およびansibleホストとして使用します。最初に行う必要があるのは、「制御マシン」をセットアップすることです。
次のコマンドを実行して、Pythonとansibleをansibleの「コントロールマシン」にインストールします。
sudo apt install python ansible -y
インストールが完了したら、新しいシステムユーザーを追加します。
Ansibleを使用してサーバープロビジョニングを実行するために、「provision」という名前の新しいユーザーを追加します。
新しいユーザー「プロビジョニング」を追加し、ユーザーにパスワードを与えます。
useradd -m -s /bin/bash provision
passwd provision
次に、以下のコマンドを使用して「/etc/sudoers.d/」の下に新しい構成ファイルを作成し、パスワードなしでsudoの「provision」ユーザーを追加します。
echo -e 'provision\tALL=(ALL)\tNOPASSWD:\tALL' > /etc/sudoers.d/provision
新しいユーザーが作成され、パスワードなしでsudoを使用できるようになりました。
このステップでは、ansibleホストのユーザーを定義します。このユーザーはansibleによって自動的に作成されるため、ユーザー名、パスワード、およびssh公開鍵を定義するだけで済みます。
サーバー(「ansi01」および「ansi02」)ごとに、パスワード「secret01」を使用して「provision」という名前の新しいユーザーを作成します。そして、mkpasswdコマンドを使用して「secret01」パスワードを暗号化する必要があります。
以下のコマンドを使用して、「secret01」パスワードを暗号化します。
mkpasswd --method=SHA-512
TYPE THE PASSWORD 'secret01'
注:
'whois'パッケージがシステムにインストールされていることを確認するか、次のコマンドを使用してインストールできます。
sudo apt install whois -y
そして、SHA-512暗号化パスワードを取得します。
次に、新しいssh-keyを生成します。
'provision'ユーザーにログインし、ssh-keygenコマンドを使用してsshキーを生成します。
su - provision
ssh-keygen -t rsa
これで、ユーザーとパスワードが定義され、sshキーが作成されました(「.ssh」ディレクトリにあります)。
このステップでは、すべてのサーバーホストのインベントリファイルを定義します。
'provision'ユーザーとしてログインし、プロジェクトの新しいディレクトリを作成します。
su - provision
mkdir -p ansible01/
'ansible01'ディレクトリに移動し、vimを使用して新しいインベントリファイル'inventory.ini'を作成します。
cd ansible01/
vim inventory.ini
次の構成をそこに貼り付けます。
[webserver]
ansi01 ansible_host=10.0.15.21
ansi02 ansible_host=10.0.15.22
保存して終了します。
次に、新しいansible構成ファイル「ansible.cfg」を作成します。
vim ansible.cfg
次の構成をそこに貼り付けます。
[defaults]
inventory = /home/provision/ansible01/inventory.ini
保存して終了します。
ansibleインベントリファイルが作成されました。ansibleスクリプトは、「ansible01」ディレクトリ内の「provision」ユーザーの下に配置されます。
Ansible Playbookは、単一またはグループのサーバーホストで実行するために送信する一連の命令です。これは、自動化がタスクとして定義され、パッケージのインストール、ファイルの編集などのすべてのジョブがansibleモジュールによって実行される、ansibleプロビジョニングを表します。
このステップでは、新しいユーザーをデプロイし、sshキーをデプロイし、sshサービスを構成するための新しいansibleプレイブックを作成します。
新しいansibleプレイブックを作成する前に、以下のようにssh-keyscanコマンドを使用してすべてのサーバーフィンガープリントをスキャンします。
ssh-keyscan 10.0.15.21 >> ~/.ssh/known_hosts
ssh-keyscan 10.0.15.22 >> ~/.ssh/known_hosts
これらのサーバーのフィンガープリントは、「。ssh/known_hosts」ファイルに保存されます。
注:
サーバーノードが多数ある場合は、ホストリストを保存してから、以下に示すように、bashスクリプトを使用してsshキーの指紋を手動でスキャンできます。
for i in $(cat list-hosts.txt)
do
ssh-keyscan $i >> ~/.ssh/known_hosts
done
次に、vimを使用して「deploy-ssh.yml」という名前のansibleプレイブックを作成します。
vim deploy-ssh.yml
そこにAnsibleプレイブックに従って貼り付けます。
---
- hosts: all
vars:
- provision_password: '$6$w9S3t7x1kRtmG0u$6nVU9KZsC12Q8DYI4FtgKPy.e/cq/jseB/.DViTO1SpUnoCy.dxcOf8hyfitGq5V0yhgXccxzlqm2o.I3SlDJ0'
gather_facts: no
remote_user: root
tasks:
- name: Add a new user named provision
user:
name=provision
password={{ provision_password }}
- name: Add provision user to the sudoers
copy:
dest: "/etc/sudoers.d/provision"
content: "provision ALL=(ALL) NOPASSWD: ALL"
- name: Deploy SSH Key
authorized_key: user=provision
key="{{ lookup('file', '/home/provision/.ssh/id_rsa.pub') }}"
state=present
- name: Disable Password Authentication
lineinfile:
dest=/etc/ssh/sshd_config
regexp='^PasswordAuthentication'
line="PasswordAuthentication no"
state=present
backup=yes
notify:
- restart ssh
- name: Disable Root Login
lineinfile:
dest=/etc/ssh/sshd_config
regexp='^PermitRootLogin'
line="PermitRootLogin no"
state=present
backup=yes
notify:
- restart ssh
handlers:
- name: restart ssh
service:
name=sshd
state=restarted
保存して終了します。
プレイブックスクリプトについて:
- 「inventory.ini」ファイルで定義されているすべてのサーバーに適用される「deploy-ssh.yml」プレイブックスクリプトを作成します。
- 新しいユーザーの暗号化されたパスワードを含むansible変数「provision_password」を作成します。
- Ansibleファクトを「no」に設定します。
- タスクの自動化を実行するためのリモートユーザーとして「root」ユーザーを定義します。
- 新しいユーザーを追加するための新しいタスクを作成し、ユーザーをsudoersに追加して、sshキーをアップロードします。
- sshサービスを構成し、ルートログインを無効にし、パスワード認証を無効にするための新しいタスクを作成します。 sshを設定するためのタスクは、「restartssh」ハンドラーをトリガーします。
- sshサービスを再起動するためのハンドラーを作成します。
'provision'ユーザーにログインし、'ansible01'ディレクトリに移動します。
su - provision
cd ansible01/
次に、以下に示すコマンドを使用して、「deploy-ssh.yml」プレイブックを実行します。
ansible-playbook deploy-ssh.yml --ask-pass
ルートパスワードを入力すると、次のような結果が得られます。
新しいユーザーとsshキーをデプロイするためのすべてのタスクが正常に完了しました。
ansibleコマンドを使用してテストします。
ansible webserver -m ping
ansible webserver -m shell -a id
これで、次のような緑色のメッセージが表示されます。
これで、Ansibleを使用してこれらの「ansi01」サーバーと「ansi02」サーバーを管理できるようになり、「provision」ユーザーがAnsibleのデフォルトユーザーになります。
サーバーへの接続のテスト
ssh 10.0.15.21
ssh 10.0.15.22
また、デフォルトのキー「.ssh / id_rsa」ファイルを使用し、ユーザー「provision」を使用して各サーバーに接続します。
ansibleを使用した新しいユーザーとssh-keyのデプロイが正常に完了しました。