
さまざまな環境(ステージと本番)のすべてのサーバーを更新するプレイブックを作成したいと思います。カーネルが更新されるたびにこのサーバーを再起動したくなく、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 PlayBookに追加の変数を渡すことができます。
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