CentOS8サーバーの初期設定とユーザー追加をAnsible使って自動化する設定
CentOS8サーバーの初期設定とユーザー追加をAnsible使って自動化する設定をメモしました。
今回の構成
クライアントのMacにインストールしてあるAnsibleから
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
へログインの設定を追加します。
ruby$ vi ~/.ssh/config
rootユーザーのコンフィグの設定
root
でvmへログインするためのコンフィグの設定を追加します。
.ssh/configHost 192.168.33.10
User root
IdentityFile ~/centos8/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
ログインテスト
正しく設定ができたかどうかテストします。
rootでログイン
ssh
コマンドでrootでログイン出来るか確認します。
sql$ ssh 192.168.33.10
Last login: Wed Jun 2 08:39:52 2021 from 192.168.33.10
Ansible の設定
Projectディレクトリへ移動
cd
コマンドでcentos8
ディレクトリへ移動します。
shell$ 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
を参照する設定を追記しています。
iniinventory = ./hosts
Projectディレクトリ配下の構成
bash./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ディレクトリ配下の構成
bash./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
はインベントリファイルで設定した
ホストを指定しています。
diff- hosts: servers
roles
roles
はハンドラ、ファイル、テンプレートなどをまとめたものです。
この後作成します。
markdown roles:
- system
- useradd
vars_files
vars_files
は変数として利用する値を定義するファイルです。
ホストを指定しています。
bash 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
がそれぞれのタスクになります。
ini# パッケージアップデート
- name: dnf update
dnf: name=* state=latest
name
name
は実行するタスクの名前になります。
実行時に下記のような形でログが出力されます。
markdownTASK [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
で定義します。
yaml# パッケージインストール
- 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の内容
yaml# グループ作成
- 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 != ""
コードの解説
group
、user
、authorized_key
はそれぞれbuiltin、posixのタスクになります。
group
ユーザーグループを作成したり変更したり削除したり操作します。
yaml- name: create groups
group:
name: '{{ item.name }}'
gid: '{{ item.gid }}'
詳しくはansible.builtin.group|Ansible Documentationをご確認ください。
user
ユーザーを作成したり変更したり削除したり操作します。
yaml- 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を操作します。
yaml- 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
では配列を設定しその配列ごとにループ処理を実施します。
タスク全体が配列の数だけ実行されます。
yaml- 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の内容
yaml# 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
コードの解説
users
、user_groups
、packages
とそれぞれ配列でデータを設定しています。
users
作成するユーザへ設定する情報をまとめています。
user_groups
作成すグループへ設定する情報をまとめています。
packages
DNFでインストールするパッケージをまとめています。
以上で設定は完了です。
Ansibleの実行
Ansibleを実行してVagrant環境へ適応
作成したAnsibleアプリケーションを実行してVagrant環境へ適応させてます。
ansible-playbookコマンド
ansible-playbook
コマンドで先ほど作成したsite.yml
を指定して実行します。
terminalansible-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
ディレクトリへ移動します。
shell$ 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
以上で確認は完了です。
記事Article
もっと見る- article
Dockerの利用していないゴミを掃除しディスクスペースを解放するいくつかのやり方を紹介
- article
Next.js のバンドルサイズを可視化する@next/bundle-analyzer の紹介
- article
VSCodeでTypescriptファイルのimport補完で相対パスではなくエイリアスするための設定
- article
UUIDより短いユニークなIDを生成できるnpmライブラリnanoidの使い方
- article
【解決方法】TypeScript発生したTS2564 エラーの対処
- article
express で IP を取得する際などに利用する req.connection 非推奨(deprecated)の対処