How to wait for server restart using Ansible?

后端 未结 11 1174
半阙折子戏
半阙折子戏 2020-12-07 13:06

I\'m trying to restart the server and then wait, using this:

- name: Restart server
  shell: reboot

- name: Wait for server to restart
  wait_for:
    port=         


        
相关标签:
11条回答
  • 2020-12-07 13:27

    I wanted to comment on Shahar post, that he is using a hardcoded host address better is to have it a variable to reference the current host ansible is configuring {{ inventory_hostname }}, so his code will be like that:

    - name: Wait for server to restart
      local_action:
        module: wait_for
         host={{ inventory_hostname }}
         port=22
         delay=1
         timeout=300
    
    0 讨论(0)
  • 2020-12-07 13:28

    Through trial and error + a lot of reading this is what ultimately worked for me using the 2.0 version of Ansible:

    $ ansible --version
    ansible 2.0.0 (devel 974b69d236) last updated 2015/09/01 13:37:26 (GMT -400)
      lib/ansible/modules/core: (detached HEAD bbcfb1092a) last updated 2015/09/01 13:37:29 (GMT -400)
      lib/ansible/modules/extras: (detached HEAD b8803306d1) last updated 2015/09/01 13:37:29 (GMT -400)
      config file = /Users/sammingolelli/projects/git_repos/devops/ansible/playbooks/test-2/ansible.cfg
      configured module search path = None
    

    My solution for disabling SELinux and rebooting a node when needed:

    ---
    - name: disable SELinux
      selinux: state=disabled
      register: st
    
    - name: reboot if SELinux changed
      shell: shutdown -r now "Ansible updates triggered"
      async: 0
      poll: 0
      ignore_errors: true
      when: st.changed
    
    - name: waiting for server to reboot
      wait_for: host="{{ ansible_ssh_host | default(inventory_hostname) }}" port={{ ansible_ssh_port | default(22) }} search_regex=OpenSSH delay=30 timeout=120
      connection: local
      sudo: false
      when: st.changed
    
    # vim:ft=ansible:
    
    0 讨论(0)
  • 2020-12-07 13:29

    2018 Update

    As of 2.3, Ansible now ships with the wait_for_connection module, which can be used for exactly this purpose.

    #
    ## Reboot
    #
    
    - name: (reboot) Reboot triggered
      command: /sbin/shutdown -r +1 "Ansible-triggered Reboot"
      async: 0
      poll: 0
    
    - name: (reboot) Wait for server to restart
      wait_for_connection:
        delay: 75
    

    The shutdown -r +1 prevents a return code of 1 to be returned and have ansible fail the task. The shutdown is run as an async task, so we have to delay the wait_for_connection task at least 60 seconds. 75 gives us a buffer for those snowflake cases.

    wait_for_connection - Waits until remote system is reachable/usable

    0 讨论(0)
  • 2020-12-07 13:29

    In case you don't have DNS setup for the remote server yet, you can pass the IP address instead of a variable hostname:

    - name: Restart server
      command: shutdown -r now
    
    - name: Wait for server to restart successfully
      local_action:
        module: wait_for
          host={{ ansible_default_ipv4.address }}
          port=22
          delay=1
          timeout=120
    

    These are the two tasks I added to the end of my ansible-swap playbook (to install 4GB of swap on new Digital Ocean droplets.

    0 讨论(0)
  • 2020-12-07 13:31

    You should change the wait_for task to run as local_action, and specify the host you're waiting for. For example:

    - name: Wait for server to restart
      local_action:
        module: wait_for
          host=192.168.50.4
          port=22
          delay=1
          timeout=300
    
    0 讨论(0)
提交回复
热议问题