[Ansible] 여러 노드를 일괄 shutdown

5243 단어 Ansible

소개



Kubernetes의 검증을 하고 있습니다만, PC상의 VM환경이므로 매일 끝난 후에 클러스터 노드를 shutdown하고 있습니다. Master 노드 1대, worker 노드 2대의 합계 3대입니다만, 각 서버에 로그인해, shutdown 하는 것이 수수하게 귀찮았습니다.
그래서 이번에는 Ansible을 사용하여 여러 노드를 일괄 shutdown 할 수 있도록하고 싶습니다.



일부러 Ansible 사용하지 않아도 좋다고 생각합니다만, 모처럼이므로 사용해 볼까라고.

Ansible 설치



Gateway 서버에 Ansible을 설치합니다.
# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
# yum install ansible
読み込んだプラグイン:fastestmirror, langpacks
Determining fastest mirrors
・・・
インストール:
  ansible.noarch 0:2.9.9-1.el7
・・・
依存性関連をインストールしました:
  python-babel.noarch 0:0.9.6-8.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-jinja2.noarch 0:2.7.2-4.el7        python-markupsafe.x86_64 0:0.11-10.el7 python-paramiko.noarch 0:2.1.1-9.el7
  python-pycparser.noarch 0:2.14-1.el7 python2-cryptography.x86_64 0:1.7.2-2.el7 python2-jmespath.noarch 0:0.9.4-2.el7  python2-pyasn1.noarch 0:0.1.9-7.el7
  sshpass.x86_64 0:1.06-2.el7

完了しました!

# ansible --version
ansible 2.9.9
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/kosuke/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

초기 설정



조작하는 대상 노드를/etc/ansible/hosts 파일에 기재합니다.

/etc/ansible/hosts
・・・
# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

[k8s] #任意のグループ名
k8s-master #グループに属する対象サーバのホスト名、IPアドレス
k8s-worker01
k8s-worker02

각 서버에는 Gateway 서버의 공개 키를 전달하여 ssh 비밀번호없이 로그인 할 수 있습니다.

비밀번호 설정



shutdown 명령을 실행할 때 각 서버의 루트 암호가 필요합니다.
Ansible에서 비밀번호를 설정하는 방법에는 여러 가지가 있지만 이번에는 일반 텍스트로 작성한 비밀번호를 암호화하여 playbook 런타임에 지정하도록 합니다.

비밀번호 파일 생성 및 암호화



먼저 일반 텍스트로 파일을 만들고 ansible-vault 명령으로 암호화합니다.
$ vi passwd.yaml
$ ansible-vault encrypt passwd.yaml
New Vault password:
Confirm New Vault password:
Encryption successful
$ cat passwd.yaml
$ANSIBLE_VAULT;1.1;AES256
61653537356139333833333230306466396533646537623366643338643366623761666436343634
3434393962303631643231653663356232613533643233300a363835316336653065326430353534
・・・

ansible.cfg에 다음 부분을 추가합니다.

/etc/ansible/ansible.cfg
[defaults]
ask_vault_pass = True #追記

playbook 만들기



다음 playbook을 만들었습니다.
shutdown은 +1을 지정하여 1분 후에 shutdown하도록 합니다. now라고 shutdown은 합니다만, 「FAILED」라고 표시됩니다. 타이밍 문제일지도 모르지만 +1을 지정하여 회피하고 있습니다.

shutdown.yaml
- hosts: k8s

  tasks:
  - name: shutdown
    command: /usr/sbin/shutdown -h +1
    become: yes

실행



playbook을 실행합니다. 이 때 암호 파일을 지정합니다.
$ ansible-playbook shutdown.yaml --extra-vars="@passwd.yaml"
Vault password:

PLAY [k8s] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************
ok: [k8s-worker01]
ok: [k8s-master]
ok: [k8s-worker02]

TASK [shutdown] ******************************************************************************************************************************************************************************
changed: [k8s-worker02]
changed: [k8s-worker01]
changed: [k8s-master]

PLAY RECAP ***********************************************************************************************************************************************************************************
k8s-master                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
k8s-worker01               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
k8s-worker02               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

성공했습니다!

요약



Ansible을 제대로 사용하는 것은 처음이었지만 생각보다 쉽게 ​​할 수있었습니다. 수수하게 귀찮았던 shutdown을 쉽게 할 수 있게 되어 좋았습니다.
Kubernetes와 조합해도 여러가지 할 수 있을 것 같네요. 이쪽도 가는 것은 해보고 싶습니다.

좋은 웹페이지 즐겨찾기