AnsibleでCentOS7初期セットアップ用のプレイブックを作成してみました

AnsibleでCentOS7インストール後の初期セットアップ用のプレイブックを作成してみました。
ググるとSSH公開鍵認証での使用例が多いですが、大量の初期セットアップを時間をかけずに実施したい目的なので、
SSHパスワード認証での使用方法を記載します。

1.環境
コントロールノード(指示を出すサーバ):CentOS7.4
ターゲットノード(指示を受けるサーバ):CentOS7.4 2台
ansibleバージョン:2.9.10

2.Ansibleの導入
コントロールノードで実行

yum install epel-release -y
yum install ansible
ansible --version

3.プレイブックの処理の内容


/etc/hosts
/etc/NetworkManager/NetworkManager.conf
/etc/resolv.conf
/etc/selinux/config
のバックアップファイルを確認し、無ければバックアップを取得する。
②.ホスト名の変更
③.NetworkManagerのDNSオプション無効化
④.resolv.confの設定
⑤.hostsファイルの設定
⑥.NTPサービスの再起動
⑦.SELinuxの無効化
⑧.サーバ再起動
⑨.サーバ再起動後の疎通確認

4.インベントリファイルとプレイブック配置用ディレクトリ作成

mkdir /etc/ansible/setup_centos7
mkdir /etc/ansible/setup_centos7/inventory
mkdir /etc/ansible/setup_centos7/roles
mkdir /etc/ansible/setup_centos7/roles/common
mkdir /etc/ansible/setup_centos7/roles/common/resolver
mkdir /etc/ansible/setup_centos7/roles/common/resolver/tasks
mkdir /etc/ansible/setup_centos7/roles/common/resolver/files
mkdir /etc/ansible/setup_centos7/roles/common/resolver/templates
mkdir /etc/ansible/setup_centos7/roles/common/reboot
mkdir /etc/ansible/setup_centos7/roles/common/reboot/tasks

5.インベントリファイルの作成
グループ毎にパスワードが異なる前提で記述してみました。

vi /etc/ansible/setup_centos7/inventory/inventory.ini

[webservers]
centos7-12 ansible_host=192.168.0.47

[dbservers]
centos7-13.test.local ansible_host=192.168.0.48


[webservers:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=password1
ansible_sudo_pass=password1

[dbservers:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=password2
ansible_sudo_pass=password2

6.pingによる疎通確認
インベントリファイルを作成したら、まずは対象ノードと疎通できるか確認してみましょう。

cd /etc/ansible/setup_centos7
ansible all -i ./inventory/inventory.ini -m ping

7.プレイブックの作成

#起点になるymlファイルの作成
vi /etc/ansible/setup_centos7/linux_initialsetup.yml

- hosts: all
  become: true
#  become_method: su
  roles:
   - name: common/resolver
     tags: resolver
   - name: common/reboot
     tags: reboot

#設定変更処理の記述
vi /etc/ansible/setup_centos7/roles/common/resolver/tasks/main.yml

#バックアップの確認1(/etc/hosts)
- name: main / backup_check(/etc/hosts)
  stat:
    path: /etc/hosts_org
  register: hosts_org

#バックアップの取得1(/etc/hosts)
- name: main / backup(/etc/hosts)
  copy:
    src: /etc/hosts
    dest: /etc/hosts_org
    remote_src: yes
  when: not hosts_org.stat.exists


#バックアップの確認2(/etc/NetworkManager/NetworkManager.conf)
- name: main / backup_check(/etc/NetworkManager/NetworkManager.conf)
  stat:
    path: /etc/NetworkManager/NetworkManager.conf_org
  register: NetworkManager_conf_org

#バックアップの取得2(/etc/NetworkManager/NetworkManager.conf)
- name: main / backup(/etc/NetworkManager/NetworkManager.conf)
  copy:
    src: /etc/NetworkManager/NetworkManager.conf
    dest: /etc/NetworkManager/NetworkManager.conf_org
    remote_src: yes
  when: not NetworkManager_conf_org.stat.exists

#バックアップの確認3(/etc/resolv.conf)
- name: main / backup_check(/etc/resolv.conf)
  stat:
    path: /etc/resolv.conf_org
  register: resolv_conf_org

#バックアップの取得3(/etc/resolv.conf)
- name: main / backup(/etc/resolv.conf)
  copy:
    src: /etc/resolv.conf
    dest: /etc/resolv.conf_org
    remote_src: yes
  when: not resolv_conf.stat.exists

#バックアップの確認4(/etc/selinux/config)
- name: main / backup_check(/etc/selinux/config)
  stat:
    path: /etc/selinux/config_org
  register: selinux_config_org

#バックアップの取得4(/etc/selinux/config)
- name: main / backup(/etc/selinux/config)
  copy:
    src: /etc/selinux/config
    dest: /etc/selinux/config_org
    remote_src: yes
  when: not selinux_config_org.stat.exists

#ホスト名の設定
- name: main / Set_hostname
#      become: true
  hostname: name="{{ inventory_hostname_short }}"

#NetworkManagerのリゾルバ設定
- name: main / Set resolver setting
  ini_file:
        dest: /etc/NetworkManager/NetworkManager.conf
        section: main
        option: dns
        value: none

#resolv.confの設定
- name: main / Deploy resolv.conf
  copy:
        src: resolv.conf
        dest: /etc/resolv.conf
        owner: root
        group: root
        mode: 0644

#hostsファイルの設定
- name: main / Deploy hosts file
  template:
        src: hosts.j2
        dest: /etc/hosts
        owner: root
        group: root
        mode: 0644

#NTPサービスの再起動
- name: main / restart NTP sevice
  systemd:
        name: ntpd
        state: restarted
        enabled: yes

#SELinuxの無効化
- name: main / Disable SELinux
  selinux:
        state: disabled


#配布用ファイルの準備

vi /etc/ansible/setup_centos7/roles/common/resolver/files/resolv.conf
# Generated by NetworkManager
nameserver 192.168.0.1


#hostsファイル作成用処理
vi /etc/ansible/setup_centos7/roles/common/resolver/templates/hosts.j2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 {{ inventory_hostname }}

{% for item in play_hosts %}
{% set short_name = item.split('.') %}
{{ hostvars[item]['ansible_default_ipv4']['address'] }}  {{ item }} {{ short_name[0] }}
{% endfor %}


#リブート処理
vi /etc/ansible/setup_centos7/roles/common/reboot/tasks/main.yml

- name: main / do sync             # sync実行
  shell: sync
- name: main / reboot              # 再起動
  shell: reboot
  async: 1                  # 非同期実行(一旦sshのコネクションが切れるが、それをエラーとしない為の対処)
  poll: 0                   # 非同期実行時にshellモジュールの戻りを待たない(同上)
- name: main / wait for reboot     # 再起動後のssh再接続待ち
  wait_for_connection:
   delay: 20               # reboot後20秒後から確認実施
   timeout: 300            # 確認タイムアウトは5分
- name: main / check connection    # 導通チェック
  ping:

8.プレイブックの処理の実行

cd /etc/ansible/setup_centos7
ansible-playbook -i ./inventory/inventory.ini ./linux_initialsetup.yml

実行結果

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

TASK [Gathering Facts] *********************************************************
ok: [centos7-13.test.local]
ok: [centos7-12]

TASK [common/resolver : main / backup_check(/etc/hosts)] ***********************
ok: [centos7-13.test.local]
ok: [centos7-12]

TASK [common/resolver : main / backup(/etc/hosts)] *****************************
skipping: [centos7-12]
skipping: [centos7-13.test.local]

TASK [common/resolver : main / backup_check(/etc/NetworkManager/NetworkManager.conf)] ***
ok: [centos7-12]
ok: [centos7-13.test.local]

TASK [common/resolver : main / backup(/etc/NetworkManager/NetworkManager.conf)] ***
skipping: [centos7-12]
skipping: [centos7-13.test.local]

TASK [common/resolver : main / backup_check(/etc/resolv.conf)] *****************
ok: [centos7-12]
ok: [centos7-13.test.local]

TASK [common/resolver : main / backup(/etc/resolv.conf)] ***********************
skipping: [centos7-12]
skipping: [centos7-13.test.local]

TASK [common/resolver : main / backup_check(/etc/selinux/config)] **************
ok: [centos7-13.test.local]
ok: [centos7-12]

TASK [common/resolver : main / backup(/etc/selinux/config)] ********************
skipping: [centos7-12]
skipping: [centos7-13.test.local]

TASK [common/resolver : main / Set hostname] ***********************************
ok: [centos7-12]
changed: [centos7-13.test.local]

TASK [common/resolver : main / Set resolver setting] ***************************
ok: [centos7-13.test.local]
ok: [centos7-12]

TASK [common/resolver : main / Deploy resolv.conf] *****************************
ok: [centos7-12]
ok: [centos7-13.test.local]

TASK [common/resolver : main / Deploy hosts file] ******************************
ok: [centos7-12]
ok: [centos7-13.test.local]

TASK [common/resolver : main / restart NTP sevice] *****************************
changed: [centos7-12]
changed: [centos7-13.test.local]

TASK [common/resolver : main / Disable SELinux] ********************************
ok: [centos7-13.test.local]
ok: [centos7-12]

TASK [common/reboot : do sync] *************************************************
changed: [centos7-13.test.local]
changed: [centos7-12]

TASK [common/reboot : reboot] **************************************************
changed: [centos7-12]
changed: [centos7-13.test.local]

TASK [common/reboot : wait for reboot] *****************************************
ok: [centos7-12]
ok: [centos7-13.test.local]

TASK [common/reboot : check connection] ****************************************
ok: [centos7-12]
ok: [centos7-13.test.local]

PLAY RECAP *********************************************************************
centos7-12                 : ok=15   changed=3    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0
centos7-13.test.local      : ok=15   changed=4    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0

9.あとがき

サービス再起動、サーバ再起動、設定ファイルの配布、設定ファイルの作成、
設定ファイルの事前バックアップ
と、このくらいあればいいかなと言う程度にAnsibleでのCentOS7の初期セットアップの処理を書いてみました。
あとは、実務で使用してみて内容を充実させて行きたいと思います。

Comments are closed.