J'essaie d'écrire un jeu de jeu ansible à bootstrap mes serveurs. Par défaut sur Linode, je ne peux que vous connecter en tant que root avec un mot de passe, donc mon jeu de jeu se connecte en tant que root, crée une non-racine. Utilisateur avec une touche SSH et désactive la racine et le mot de passe SSH.
Ceci est un problème parce que je ne peux plus exécuter que PlayBook puisque la connexion racine est désactivée! J'aimerais que le jeu de jeu soit idempotent et ne pas avoir à ajouter et à supprimer des hôtes après les boots.
J'aime le faire de cette façon:
- hosts: all
remote_user: root
gather_facts: no
tasks:
- name: Check ansible user
command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
delegate_to: 127.0.0.1
changed_when: false
failed_when: false
register: check_ansible_user
- block:
- name: Create Ansible user
user:
name: ansible
comment: "Ansible user"
password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
Shell: /bin/bash
- name: Add authorized key
authorized_key:
user: ansible
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
exclusive: yes
- name: Allow Sudo for ansible
copy:
content: ansible ALL=(ALL) ALL
dest: /etc/sudoers.d/ansible
mode: 0600
when: check_ansible_user | failed
J'essaie de vous connecter à l'hôte distant avec mon utilisateur ansible. Si cela est impossible (à la première exécution), je me connecte en tant que root et crée l'utilisateur ansible avec son authorized_keys
Dossier et Sudo
droits.
Sur les exécutions suivantes, la connexion en tant qu'utilisateur ansitaire fonctionne, le bloc de tâches peut être ignoré.
Une fois que l'hôte distant est bootstrapped, je peux continuer avec l'utilisateur ansible et become
:
- hosts: all
remote_user: ansible
become: yes
roles:
- ...
Si vous créez vos serveurs sur Linode avec le module de linode Vous pouvez enregistrer le return value
de la tâche linode
_ inclut les tâches bootstrap avec une condition vérifiant la sortie de la tâche de linode. Essayez quelque chose comme ça:
- linode:
api_key: 'longStringFromLinodeApi'
name: linode-test1
plan: 1
datacenter: 2
distribution: 99
password: 'superSecureRootPassword'
private_ip: yes
ssh_pub_key: 'ssh-rsa qwerty'
swap: 768
wait: yes
wait_timeout: 600
state: present
register: linode_node
- include: bootstrap.yml
when: linode_node.changed
bootstrap.yml
serait que contenir toutes les tâches nécessaires pour désactiver la connexion racine SSH et ainsi de suite.
Je ferais ce qui suit:
sshd_config
(J'aurais tendance à vous recommander de gérer l'intégralité du fichier, à l'aide d'un template
, mais qui est à vous) et désactivez les connexions racinesPour le premier rôle (la base), j'ai tendance à utiliser quelque chose comme:
name: base | local ansible user | create user
user:
name: "{{ local_ansible_user }}"
group: "{{ local_ansible_group }}"
home: "/home/{{ local_ansible_user }}"
state: present
generate_ssh_key: "{{ local_ansible_generate_key }}"
ssh_key_bits: 4096
ssh_key_type: rsa
tags:
- ansible
- local_user
- name: base | local ansible user | provision authorised keys
authorized_key:
user: "{{ local_ansible_user }}"
state: present
key: "{{ item }}"
with_items: "{{ local_ansible_authorised_keys }}"
tags:
- ansible
- authorised_keys
Pour la configuration SSH, j'utiliserais:
- name: openssh | server | create configuration
template:
src: sshd_config.j2
dest: /etc/ssh/sshd_config
owner: root
group: root
mode: "0640"
validate: "/usr/sbin/sshd -tf %s"
notify:
- openssh | server | restart
tags:
- ssh
- openssh
Les dépendances du rôle de l'Ansible sont documentées ici .
Vous pouvez également utiliser simplement la commande dans votre jeu de jeu pour le faire.
J'ai une partie des choses ansibles sur github (à partir de laquelle ce qui précède est pris), si vous voulez le voir dans son contexte