서버를 다시 시작하기 위해 Ansible 플레이북을 설정하는 방법

서버를 다시 시작하기 위해 Ansible 플레이북을 설정하는 방법

다양한 환경(스테이지 및 프로덕션)의 모든 서버를 업데이트하는 플레이북을 작성하고 싶습니다. 커널이 업데이트될 때마다 이 서버를 재부팅하고 싶지 않고, 2개월마다 재부팅하고 싶습니다.

다시 시작하려는 경우에만 모든 서버의 다시 시작을 트리거하기 위해 다시 시작 변수를 ansible 명령에 전달하는 방법이 있습니까?

Jenkins를 사용하여 업데이트 작업을 실행하겠습니다.

샘플 코드는 다음과 같습니다.

- hosts: all
  become: yes
  tasks:  
    - name: Making changes to the yum.conf file
      shell: sudo sed "s/exclude=kernel/#exclude=kernel/g" /etc/yum.conf
      args:
        executable: /bin/bash

    - name: Performing yum update
      yum:
        update_cache: yes
        name: '*'
        state: latest
        update_cache: yes

    - name: Checking for reboot
      shell: LAST_KERNEL=$(rpm -q --last kernel | awk 'NR==1{sub(/kernel-/,""); print $1}'); CURRENT_KERNEL=$(uname -r); if [ $LAST_KERNEL != $CURRENT_KERNEL ]; then echo 'reboot'; else echo 'no'; fi
      ignore_errors: true
      register: reboot_hint

    - name: Rebooting servers now ...
      command: shutdown -r now "Reboot required for updated kernel"
      async: 0
      poll: 0
      sudo: true
      ignore_errors: true
      when: reboot_hint.stdout.find("reboot") != -1
      register: rebooting

    - name: Taking a nap while servers reboot...
      pause: seconds=200
      when: rebooting is changed

    - name: Confirming servers are back online
      wait_for:
        host: "{{ ansible_ssh_host | default(inventory_hostname) }}"
        delay: 30
        state: started
        search_regex: OpenSSH
        port: 22
      become: false
      when: reboot is changed
      delegate_to: localhost

답변1

다음을 실행하여 Ansible 플레이북에 추가 변수를 전달할 수 있습니다.

ansible-playbook --limit whatever myplaybook.yml --extra-vars reboot=now

스크립트 상단을 수정합니다.

- hosts: all
  become: yes
  vars:
    reboot: notnow

다시 시작 작업은 다음과 같습니다.

- name: Rebooting servers now ...
  command: shutdown -r now "Reboot required for updated kernel"
  async: 0
  poll: 0
  sudo: true
  ignore_errors: true
  when: reboot == "now"
  register: rebooting

extra-vars 매개변수를 전달하지 않으면 var의 값이 "notnow"가 되어 when조건이 충족되지 않습니다.

답변2

이제 간단히 머신을 재부팅할 수 있는 모듈이 있습니다:https://docs.ansible.com/ansible/latest/modules/reboot_module.html

관련 정보