Ansible로 SSH 포트 변경을 처리하는 방법은 무엇입니까?


27

새 서버 인스턴스의 설정 프로세스를 자동화하기 위해 Ansible을 사용하려고합니다. 설정 작업 중 하나가 기본 SSH 포트를 변경하므로 호스트 목록을 업데이트해야합니다.

기본 SSH 포트에 연결할 수없는 경우 지정된 포트로 대체 할 수 있도록하여이를 자동화 할 수 있습니까?

답변:


15

호스트에서 local_action을 시도하여 각 포트에 연결하고 성공한 포트를 등록하고 사실로 설정할 수 있는지 확인하십시오. 수집 사실을 끄려면 설정 모듈이 이미 재구성 된 호스트와 연결을 시도 할 때 실패하므로 설정 사실을 끄고 싶습니다. 이 플레이를 마치면 gather_facts 및 나머지를 모두 포함하여 아래에 다른 것을 추가하십시오.

- name: determine ssh port
  hosts: all
  gather_facts: false
  vars:
    custom_ssh_port: 222
  tasks:
    - name: test default ssh port
      local_action: wait_for port=22 timeout=5 host={{inventory_hostname}}
      register: default_ssh
      ignore_errors: true
    - name: set ansible_ssh_port to default
      set_fact: ansible_ssh_port=22
      when: default_ssh.elapsed < 5
    - name: test ssh on high port
      local_action: wait_for port={{custom_ssh_port}} timeout=5 host={{inventory_hostname}}
      register: high_ssh
      when: default_ssh.elapsed >= 5
      ignore_errors: true
    - name: set ansible_ssh_port high
      set_fact: ansible_ssh_port={{custom_ssh_port}}
      when: default_ssh.elapsed >= 5 and high_ssh.elapsed < 5

이것이 당신이 이것을 사용하는 플레이 북의 시간을 날려 버릴 것이라고 나에게 지적되었습니다. ssh 포트가 재구성 된 호스트에서만 실행되는 play의 vars 섹션에서 ansible_ssh_port를 설정할 수도 있습니다. 예 :

- name: change ssh ports
  tasks:
    - name: edit sshd_config
      lineinfile ..
      notify: restart ssh
   handlers:
     - name: restart ssh
       service: sshd state=restarted
- name: continue setup
  vars:
    - ansible_ssh_port : 5422
  tasks:
    ...

사실 설정과 관련한 포트 테스트 전략은 이러한 경우에 이상적인 접근 방법 인 것 같습니다. 감사!!!
Jay Taylor

10

@RichardSalts 시작해 주셔서 감사합니다. nc를 사용하여 훨씬 빠른 포트를 확인했습니다. 이것은 내 bootstrap.xml입니다.

ansible 1.5 (devel 3b8fd62ff9)를 사용하여 테스트 마지막 업데이트 2014/01/28 20:26:03

---
# Be sure to set the following variables for all hosts:
# vars:
#   oldsshport: 22
#   sshport: 555
# Might fail without setting remote_tmp = /tmp/ansible/$USER in your ansible.cfg. Also fix for directly below.
# Once host is setup most of the checks are skipped and works very quickly.
# Also, be sure to set non-standard shells in a different playbook later. Stick with /bin/bash until you can run apt install.
# Assumes root user has sshkey setup already. Not sure how to utilize the --ask-pass option. For now, use ssh-copy-id prior to running playbook on new host for root user (if needed).

# Test new ssh port
- name: ssh test nc {{ sshport }}
  local_action: shell nc -z -w5 {{ inventory_hostname }} {{ sshport }}
  register: nc_ssh_port
  failed_when: nc_ssh_port.stdout.find('failed') != -1
  changed_when: nc_ssh_port.stdout == ""
  ignore_errors: yes

# Set port to new port if connection success
- name: set ansible_ssh_port
  set_fact: ansible_ssh_port={{ sshport }}
  when: nc_ssh_port|success

# Fail back to old port if new ssh port fails
- name: ssh test nc port {{ oldsshport }}
  local_action: shell nc -z -w5 {{ inventory_hostname }} {{ oldsshport }}
  register: nc_ssh_default
  changed_when: nc_ssh_default.stdout == ""
  ignore_errors: yes
  when: nc_ssh_port|changed

# Set ansible to old port since new failed
- name: set ansible_ssh_port to {{ oldsshport }}
  set_fact: ansible_ssh_port={{ oldsshport }}
  when: nc_ssh_default|success and nc_ssh_port|changed

# Check if root user can ssh
- name: find user
  local_action: shell ssh -o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=5 -p {{ ansible_ssh_port }} root@{{ inventory_hostname }} exit
  register: ssh_as_root
  failed_when: ssh_as_root.stdout.find('failed') != -1
  changed_when: ssh_as_root.stderr.find('Permission denied') == -1

# If root user success, set this up to change later
- name: first user
  set_fact: first_user={{ ansible_ssh_user }}
  when: ssh_as_root|changed

# Set ssh user to root
- name: root user
  set_fact: ansible_ssh_user=root
  when: ssh_as_root|changed

# ANSIBLE FIX: /tmp/ansible isn't world-writable for setting remote_tmp = /tmp/ansible/$USER in ansible.cfg
- name: /tmp/ansible/ directory exists with 0777 permission
  file: path=/tmp/ansible/ owner=root group=root mode=0777 recurse=no state=directory
  changed_when: False
  sudo: yes

# Setup user accounts
- include: users.yml

# Set ssh user back to default user (that was setup in users.yml)
- name: ansible_ssh_user back to default
  set_fact: ansible_ssh_user={{ first_user }}
  when: ssh_as_root|changed

# Reconfigure ssh with new port (also disables non-ssh key logins and disable root logins)
- name: sshd.conf
  template: src=sshd_config.j2 dest=/etc/ssh/sshd_config owner=root group=root mode=0644
  register: sshd_config
  sudo: yes

# Force changes immediately to ssh
- name: restart ssh
  service: name=ssh state=restarted
  when: sshd_config|changed
  sudo: yes

# Use updated ssh port
- name: set ansible_ssh_port
  set_fact: ansible_ssh_port={{ sshport }}
  when: nc_ssh_port|changed

5

아마도 ssh 설정을 조기에 배포 할 것이기 때문에이를 간단하게 유지해야합니다. 대상으로 인벤토리를 구성하고 ssh 구성을 처음 배포 할 때 ansible_ssh_port사용 -e하십시오.

ansible-playbook bootstrap_ssh.yml -e 'ansible_ssh_port=22'

참고 ansible_ssh_port2.0에서 더 이상 사용되지 않습니다 (로 대체 ansible_port)


3

기본 SSH 포트에 연결할 수없는 경우 지정된 포트로 대체 할 수 있도록하여이를 자동화 할 수 있습니까?

또한 비슷한 기능이 필요했기 때문에 Ansible Inc.에서 채택하기를 바라면서 Ansible ssh 플러그인을 포크하고 패치했습니다. 그들은하지 않았다. std 이외의 ssh 포트 스펙을 테스트하여 개방 상태인지 확인하고 그렇지 않은 경우 기본 ssh 포트로 되돌립니다. https://github.com/crlb/ansible 에서 사용할 수있는 매우 작은 패치 입니다.


1

포트 목록이 있고 모든 포트를 확인하고 작동하는 포트를 사용하려면 다음과 같이 플레이 북에서 사용할 수 있습니다.

- name: just test
  hosts: server
  gather_facts: false
  vars:
    list_of_ssh_ports: [22, 222, 234]
  tasks:
    - name: test ssh on port
      sudo: no
      local_action: wait_for port={{item}} timeout=5 host={{inventory_hostname}}
      register: ssh_checks
      with_items: "{{list_of_ssh_ports}}"
      ignore_errors: true
    - debug: msg = "{{item}}"
      with_items: "{{ssh_checks.results}}"
    - name: set available ansible_ssh_port 
      sudo: no
      set_fact: ansible_ssh_port={{item.item}}
      when: ssh_checks is defined and {{item.elapsed}} < 5
      with_items: "{{ssh_checks.results}}"

0

인벤토리 파일을 변경하지 않고 SSH 포트를 변경하고 올바른 포트에 대한 연결을 처리하는 역할을하는 강력한 dem 등원 작업 목록을 생각해 냈습니다. 내 블로그에 세부 정보를 게시했습니다 : https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/


3
실제로는 쉽게 잃을 수있는 내용을 가리키는 포인터가 아닌 내용을 포함하는 답변을 선호합니다.
user9517은 GoFundMonica

또한 스크립트가 실패하고 default_ssh.state에서 예외가 발생합니다'dict object' has no attribute 'state'
sandre89
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.