Bagaimana cara menangani perubahan port SSH dengan Ansible?
27
Saya mencoba menggunakan Ansible untuk mengotomatiskan proses pengaturan instance server baru. Salah satu tugas pengaturan mengubah port SSH default, oleh karena itu mengharuskan saya untuk memperbarui daftar host.
Apakah mungkin untuk mengotomatisasi ini dengan mengembalikan Kemungkinan ke port yang ditentukan jika koneksi tidak dapat dibuat ke port SSH default?
Anda dapat mencoba local_action pada host untuk melihat apakah Anda dapat terhubung ke masing-masing port dan mendaftarkan yang berhasil dan mengaturnya sebagai fakta. Anda ingin mematikan pengumpulan fakta karena jika tidak, modul pengaturan akan gagal saat mencoba terhubung dengan host yang telah dikonfigurasi ulang. Setelah Anda selesai memainkan ini, tambahkan saja yang lain di bawah ini dengan collect_facts dan yang lainnya.
- 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
Telah ditunjukkan kepada saya bahwa ini akan meledakkan waktu untuk buku pedoman tempat Anda menggunakan ini. Anda juga dapat mengatur ansible_ssh_port di bagian vars dari lakon yang seharusnya hanya dijalankan pada host dengan port ssh yang dikonfigurasi ulang. misalnya
Strategi pengujian pelabuhan Anda bersama dengan pengaturan fakta tampaknya merupakan pendekatan yang ideal untuk kasus-kasus ini. Terima kasih!!!
Jay Taylor
10
@RichardSalts terima kasih sudah memulai saya dengan ini. Saya menggunakan nc untuk memeriksa port yang seharusnya jauh lebih cepat. Ini adalah bootstrap.xml saya:
Diuji menggunakan ansible 1.5 (devel 3b8fd62ff9) terakhir diperbarui 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
Karena Anda mungkin menggunakan konfigurasi ssh Anda lebih awal, Anda harus menjaga ini tetap sederhana. Cukup konfigurasikan inventaris Anda dengan target ansible_ssh_portdan gunakan -eketika menggunakan konfigurasi ssh Anda untuk pertama kalinya:
Apakah mungkin untuk mengotomatisasi ini dengan mengembalikan Kemungkinan ke port yang ditentukan jika koneksi tidak dapat dibuat ke port SSH default?
Saya juga membutuhkan fungsionalitas yang serupa, jadi saya melakukan forked dan menambal plugin Ansible ssh dengan harapan bahwa Ansible Inc. akan mengadopsinya; mereka tidak melakukannya. Ini menguji spesifikasi port ssh non-std untuk melihat apakah port terbuka dan kembali ke port ssh default jika tidak. Ini adalah tambalan yang sangat kecil, tersedia di https://github.com/crlb/ansible .
Jika Anda memiliki daftar port dan Anda ingin memeriksa semuanya dan menggunakan yang berfungsi, Anda dapat menggunakan ini di buku pedoman Anda:
- 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}}"
Saya datang dengan daftar tugas idempoten yang kuat untuk berperan mengubah port SSH dan menangani koneksi ke port yang tepat tanpa harus mengubah file inventaris Anda. Saya telah memposting detailnya di blog saya: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/
@RichardSalts terima kasih sudah memulai saya dengan ini. Saya menggunakan nc untuk memeriksa port yang seharusnya jauh lebih cepat. Ini adalah bootstrap.xml saya:
Diuji menggunakan ansible 1.5 (devel 3b8fd62ff9) terakhir diperbarui 2014/01/28 20:26:03
sumber
Karena Anda mungkin menggunakan konfigurasi ssh Anda lebih awal, Anda harus menjaga ini tetap sederhana. Cukup konfigurasikan inventaris Anda dengan target
ansible_ssh_port
dan gunakan-e
ketika menggunakan konfigurasi ssh Anda untuk pertama kalinya:Catatan yang
ansible_ssh_port
sudah usang 2.0 (digantikan olehansible_port
)sumber
Saya juga membutuhkan fungsionalitas yang serupa, jadi saya melakukan forked dan menambal plugin Ansible ssh dengan harapan bahwa Ansible Inc. akan mengadopsinya; mereka tidak melakukannya. Ini menguji spesifikasi port ssh non-std untuk melihat apakah port terbuka dan kembali ke port ssh default jika tidak. Ini adalah tambalan yang sangat kecil, tersedia di https://github.com/crlb/ansible .
sumber
Jika Anda memiliki daftar port dan Anda ingin memeriksa semuanya dan menggunakan yang berfungsi, Anda dapat menggunakan ini di buku pedoman Anda:
sumber
Saya datang dengan daftar tugas idempoten yang kuat untuk berperan mengubah port SSH dan menangani koneksi ke port yang tepat tanpa harus mengubah file inventaris Anda. Saya telah memposting detailnya di blog saya: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/
sumber
'dict object' has no attribute 'state'