CentOS8サーバーの初期設定とユーザー追加をAnsible使って自動化する設定

CentOSAnsibleVagrantVirtualBox環境構築
CentOS8サーバーの初期設定とユーザー追加をAnsible使って自動化する設定
Memo
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CentOS8サーバーの初期設定とユーザー追加をAnsible使って自動化する設定をメモしました。

今回の構成

クライアントのMacにインストールしてあるAnsibleから
VagrantとVirtualBoxでCentOS8環境の設定をおこないます。

Mac(クライアント)からVagrantとVirtualBoxでCentOS8環境の設定

Ansibleのインストール

Ansibleのインストールについては以前にインストール手順をまとめていますので
こちらの記事を参考にしてください。

CentOS8環境の構築

CentOS8環境の構築については以前にVagrantとVirtualBoxによる構築手順をまとめていますので
こちらの記事を参考にしてください。

VagrantとVirtualBoxでCentOS8環境を構築

環境

  • Mac OS Big SUR 11.3.1
  • Vagrant 2.2.16
  • VirtualBox 6.1.22 r144080
  • CentOS Linux release 8.3.2011

作業ディレクトリについて

作業ディレクトリは下記の記事で構築したVagrantfileを設定した~/centos8ディレクトリで実施していきます。 またVMのIPも下記記事同様192.168.33.10で設定していきます。

ファイル操作で利用するUnixコマンド

基本的なディレクトリ作成やファイル操作はUnixコマンドを利用します。
Unixコマンドについて詳しくはこちらの記事を参考にしてください。

VMへrootユーザーがログインするための設定

最初にAnsibleが設定を行うために
VMへrootユーザーでログインするための公開鍵認証の設定を行ってきます。

公開鍵認証について

公開鍵認証について以前にまとめていますのでこちらの記事を参考にしてください。

authorized_keysを設定

VMへログインしrootユーザーのauthorized_keysを設定します。
今回はVagrantで構築している環境のためあらためて公開鍵は作成せず
Vagrantユーザーのものをrootユーザーで利用できる対応を行っていきます。

VM へログイン

vagrant sshコマンドで VM へログインします。

terminal|ホストOS
$ vagrant ssh

rootへスイッチ

su -コマンドを叩いてrootへスイッチします。
パスワードを聞かれるのでvagrantと入力します。

terminal|ゲストOS
$ su - Password:

.sshディレクトリを作成

.sshディレクトリを作成します。

terminal|ゲストOS
$ mkdir -p ~/.ssh

.sshのパーミッションを変更

.sshのパーミッションを700へ変更します。

terminal|ゲストOS
$ chmod 700 ~/.ssh

authorized_keysをコピー

vagrantユーザーのauthorized_keysをコピーして持ってきます。

terminal|ゲストOS
$ cp /home/vagrant/.ssh/authorized_keys ~/.ssh/

authorized_keysのパーミッションを変更

authorized_keysのパーミッションを600へ変更します。

terminal|ゲストOS
$ chmod 600 ~/.ssh/authorized_keys

ログアウト

ゲストOSからログアウトします。

terminal|ゲストOS
[root@localhost ~]# exit; logout [vagrant@localhost ~]$ exit; logout Connection to 127.0.0.1 closed.

.ssh/configの設定

.ssh/configへログインの設定を追加します。

$ vi ~/.ssh/config

rootユーザーのコンフィグの設定

rootでvmへログインするためのコンフィグの設定を追加します。

ssh/config
Host 192.168.33.10 User root IdentityFile ~/centos8/.vagrant/machines/default/virtualbox/private_key IdentitiesOnly yes

ログインテスト

正しく設定ができたかどうかテストします。

rootでログイン

sshコマンドでrootでログイン出来るか確認します。

$ ssh 192.168.33.10
Last login: Wed Jun  2 08:39:52 2021 from 192.168.33.10

Ansible の設定

Projectディレクトリへ移動

cdコマンドでcentos8ディレクトリへ移動します。

$ cd  ~/centos8

Ansible の設定を配置するためのansibleディレクトリを作成します。

terminal
$ mkdir -p ~/centos8/ansible

ansible.cfg の作成

Ansible の設定ファイル ansible.cfg を準備します。

terminal
$ vi ~/centos8/ansible/ansible.cfg

下記内容を追記します。

ansible.cfgの内容

ansible.cfg
[defaults] inventory = ./hosts

コードの解説

inventory のファイル置き場として./hostsを参照する設定を追記しています。

inventory   = ./hosts

Projectディレクトリ配下の構成

./ansible
└── ansible.cfg

inventory ファイルの作成

hosts ファイルの作成

先ほどansible.cfgへ inventory ファイル置き場として定義したhostsというファイル名で作成します。

terminal
$ vi ~/centos8/hosts

Vagrantfile で設定した Vagrant で起動する VM の IP を入力します。

ansible.cfgの内容

/hosts
[servers] 192.168.33.10

Projectディレクトリ配下の構成

./ansible
├── ansible.cfg
└── hosts

Ansible 経由で ping 実行

Ansible経由でrootユーザーが initへ初期設定するための接続ができるか確認します。

terminal
$ ansible init -m ping -u root 192.168.33.10 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }

Playbook の作成

プレイブックファイルをsite.ymlという名前で作成します。

terminal
$ vi ~/centos8/ansible/site.yml

下記内容を追記します。

site.ymlの内容

centos8/ansible/site.yml
- hosts: servers roles: - system - useradd vars_files: - group_vars/all.yml

コードの解説

hosts

hostsはインベントリファイルで設定した
ホストを指定しています。

- hosts: servers

roles

rolesはハンドラ、ファイル、テンプレートなどをまとめたものです。 この後作成します。

  roles:
    - system
    - useradd

vars_files

vars_filesは変数として利用する値を定義するファイルです。
ホストを指定しています。

  vars_files:
    - group_vars/all.yml

Rolesの作成

今回は下記のロールを作成していきます。

  • system
  • useradd

system

systemはシステム系のロールを作成します。
パッケージのアップデートやタイムゾーンの設定などを実施します。

systemロールの作成

まずmkdirコマンドでroles/system/taskディレクトリを作成します。

terminal
$ mkdir -p ~/centos8/ansible/roles/system/task

実際にタスクを記述するmain.ymlファイルを作成します。

terminal
$ vi ~/centos8/ansible/roles/system/task/main.yml

下記内容を追記します。

main.ymlの内容

centos8/ansible/roles/system/task/main.yml
# パッケージアップデート - name: dnf upgrade yum: name=* state=latest # パッケージインストール - name: dnf install yum: name: '{{packages}}' # ロケール事前確認 - name: check locale shell: localectl status register: check_localectl_result check_mode: no changed_when: false # ロケール設定 - name: set locale shell: localectl set-locale LANG=ja_JP.utf8 when: "'LANG=ja_JP.utf8' not in check_localectl_result.stdout" # タイムゾーン設定 - name: set timezone to Asia/Tokyo timezone: name: Asia/Tokyo # # SELinux無効化 - name: disable SELinux selinux: state=disabled # # firewalld無効化 - name: disable firewalld systemd: name: firewalld state: stopped enabled: false

コードの解説

-nameがそれぞれのタスクになります。

# パッケージアップデート
- name: dnf update
  dnf: name=* state=latest

name

nameは実行するタスクの名前になります。
実行時に下記のような形でログが出力されます。

TASK [system : dnf upgrade] ************************************************************************
ok: [192.168.33.10]

dnf

dnfはAnsibleのbuiltinで利用するdnfタスクです。 Ansible1.9以降から利用ができます。

設定されている値はインストールされているname=*
最新にするstate=latestというタスクになります。

dnfのパラメータや詳細についてはansible.builtin.dnf|Ansible Documentationをご確認ください。

変数について

{{packages}}は変数になります。
後ほど紹介しますがvars_filesで定義します。

# パッケージインストール
- name: dnf install
  yum:
    name: '{{packages}}'

その他のロールについて

Ansibleのロールはbuiltinで利用できるタスクや直接コマンドを実行するなどさまざまなことが可能です。
詳しくはロール|Ansible Documentationをご確認ください。

useradd

useraddはユーザーとグループを作成します。
パッケージのアップデートやタイムゾーンの設定などを実施します。

useraddロールの作成

まずmkdirコマンドでroles/useradd/taskディレクトリを作成します。

terminal
$ mkdir -p ~/centos8/ansible/roles/useradd/task

実際にタスクを記述するmain.ymlファイルを作成します。

terminal
$ vi ~/centos8/ansible/roles/useradd/task/main.yml

下記内容を追記します。

main.ymlの内容

# グループ作成
- name: create groups
  group:
    name: '{{ item.name }}'
    gid: '{{ item.gid }}'
  with_items:
    - '{{ user_groups }}'
# ユーザー作成
- name: create users
  user:
    name: '{{ item.name }}'
    password: "{{ item.password | password_hash('sha512') }}"
    uid: '{{ item.uid }}'
    groups: '{{ item.group }}'
    shell: /bin/sh
  with_items: '{{ users }}'
# グループ追加
- name: Add to group
  user:
    name: '{{ item.name }}'
    append: yes
    groups: '{{ item.group }}'
  with_items: '{{ users }}'

# authorized_keyへ公開鍵を追記
- name: Add public key
  authorized_key:
    user: '{{ item.name }}'
    state: present
    key: "{{ lookup('file', item.publick_key) }}"
  with_items: '{{  users  }}'
  when: item.publick_key != ""

コードの解説

groupuserauthorized_keyはそれぞれbuiltin、posixのタスクになります。

group

ユーザーグループを作成したり変更したり削除したり操作します。

- name: create groups
  group:
    name: '{{ item.name }}'
    gid: '{{ item.gid }}'

詳しくはansible.builtin.group|Ansible Documentationをご確認ください。

user

ユーザーを作成したり変更したり削除したり操作します。

- name: create users
  user:
    name: '{{ item.name }}'
    password: "{{ item.password | password_hash('sha512') }}"
    uid: '{{ item.uid }}'
    groups: '{{ item.group }}'
    shell: /bin/sh

詳しくはansible.builtin.user|Ansible Documentationをご確認ください。

authorized_key

~/.ssh/authorized_keyのauthorized_keyを操作します。

- name: Add public key
  authorized_key:
    user: '{{ item.name }}'
    state: present
    key: "{{ lookup('file', item.publick_key) }}"

詳しくはansible.posix.authorized_key|Ansible Documentationをご確認ください。

with_items

with_itemsでは配列を設定しその配列ごとにループ処理を実施します。
タスク全体が配列の数だけ実行されます。

- name: create groups
  group:
    name: '{{ item.name }}'
    gid: '{{ item.gid }}'
  with_items:
    - '{{ user_groups }}'

詳しくはwith_imates|ループ|Ansible Documentationをご確認ください。

when

whenは設定した条件がtrueの場合のみ処理が実行されます。
authorized_keyの場合public_keyが指定されていたら処理が実行されます。

詳しくはWhen ステートメント|条件 (Conditional)|Ansible Documentationをご確認ください。

vars_filesの作成

vars_filesは変数として利用する値を定義するファイルです。

systemロールの作成

まずmkdirコマンドでansible/group_varsディレクトリを作成します。

terminal
$ mkdir -p ~/centos8/ansible/group_vars

実際にタスクを記述するall.ymlファイルを作成します。

terminal
$ vi ~/centos8/ansible/group_vars/all.yml

下記内容を追記します。

all.ymlの内容

# User
users:
  - {
      name: 'hoge',
      uid: 1001,
      group: 'operator',
      password: 'hoge-password',
      publick_key: '~/.ssh/id_rsa.pub',
      comment: 'hogeユーザ',
    }
  - {
      name: 'fuga',
      uid: 1002,
      group: 'operator',
      password: 'fuga-password',
      comment: 'fugaユーザ',
    }

user_groups:
  - {
      name: 'operator',
      gid: 2001,
      comment: 'operatorグループ',
    }

# System

packages:
  - langpacks-ja
  - vim

コードの解説

usersuser_groupspackagesとそれぞれ配列でデータを設定しています。

users

作成するユーザへ設定する情報をまとめています。

user_groups

作成すグループへ設定する情報をまとめています。

packages

DNFでインストールするパッケージをまとめています。

以上で設定は完了です。

Ansibleの実行

Ansibleを実行してVagrant環境へ適応

作成したAnsibleアプリケーションを実行してVagrant環境へ適応させてます。

ansible-playbookコマンド

ansible-playbookコマンドで先ほど作成したsite.ymlを指定して実行します。

terminal
ansible-playbook site.yml // 中略 PLAY RECAP ***************************************************************************************** 192.168.33.10 : ok=11 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

failedとなっているタスクがなければ成功です。

設定が正しく出来ているか確認

Ansibleの設定を適応したVMへログイン

VagrantfileがあるProjectディレクトリへ移動

cdコマンドでcentos8ディレクトリへ移動します。

$ cd  ~/centos8

VM へログイン

vagrant sshコマンドで VM へログインします。

terminal|ホストOS
$ vagrant ssh

設定の確認

DNFインストールの確認

dnf list --installedコマンドでパッケージがインストールされているか確認します。

terminal|ゲストOS
$ sudo dnf list --installed | grep vim vim-common.x86_64 2:8.0.1763-15.el8 @appstream vim-enhanced.x86_64 2:8.0.1763-15.el8 @appstream vim-filesystem.noarch 2:8.0.1763-15.el8 @appstream vim-minimal.x86_64 2:8.0.1763-15.el8 @anaconda

timezoonの確認

timedatectlコマンドで現在のtimezoonの設定を確認します。

terminal|ゲストOS
$ sudo timedatectl Local time: Thu 2021-06-03 14:24:36 JST Universal time: Thu 2021-06-03 05:24:36 UTC RTC time: Thu 2021-06-03 05:24:34 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes NTP service: active RTC in local TZ: no

ユーザーの確認

/etc/passwdを確認し作成したユーザーがいるか確認します。

terminal|ゲストOS
$ cat /etc/passwd | grep hoge hoge:x:1001:2001::/home/docker:/bin/sh

以上で確認は完了です。

終わりに

最後までご覧いただきありがとうございます。
この記事ではCentOS8サーバーの初期設定とユーザー追加をAnsible使って自動化する設定について紹介させていただきました。

これからも皆様の開発に役立つ情報を提供していきたいと考えています。
今後ともよろしくお願いいたします。