Effectuez le traitement suivant dans Ansible. En outre, Ansible s'exécute sur un conteneur Docker. ① Utilisez l'AWS CLI pour séparer l'EC2 cible de l'ELB ② Une fois la déconnexion terminée, exécutez la mise à jour de yum ③ Redémarrez l'instance ④ Enregistrez-vous à nouveau auprès d'ELB
1-1. Création d'un répertoire Docker et d'un Dockerfile Créez un répertoire et un Dockerfile.
$ sudo mkdir docker-demo
$ cd docker-demo
$ sudo vim Dockerfile
1-2. Modification du Dockerfile Comme Ansible nécessite Python, nous utiliserons le slim-buster léger dans l'image officielle Docker Python. WORKDIR spécifie le répertoire dans lequel les fichiers Ansible qui seront créés ultérieurement seront placés. Installez ansible et ssh. (Si vous souhaitez vous connecter ssh au nœud cible avec un mot de passe, vous devez également installer sshpass)
Dockerfile
FROM python:3.9.0-slim-buster
WORKDIR /usr/src/app
RUN pip install ansible
RUN apt-get update && apt-get install -y \
vim \
ssh
2-1. Création de fichiers Créez un fichier à utiliser avec Ansible.
$ cd /usr/src/app
$ sudo touch inventory main.yml ansible.cfg
2-2. Modification du fichier d'inventaire Spécifiez l'adresse IP du nœud cible. De plus, puisque la connexion est établie par SSH, entrez le nom d'utilisateur et le chemin de la clé privée.
inventory
[targets]
10.0.1.100
[targets:vars]
ansible_connection=ssh
ansible_user=ec2-user
ansible_ssh_private_key_file=/usr/src/app/.ssh/Fichier de clé privée
2-3. Modification de main.yml Cette fois, tous les processus sont décrits dans main.yml. (J'ai écrit la commande aws cli dans le shell et spécifié arn dans main.yml, mais je pense qu'il y a une meilleure façon de l'écrire ...) yum, reboot et wait_for_connection utilisent le module Ansible. Utilisez wait_for_connection pour continuer le traitement même après le redémarrage.
main.yml
- hosts: targets
become: yes
gather_facts: no
tasks:
##################################################
# deregister instances from elb
##################################################
- name: deregistering instances from elb
become: yes
shell: >
aws elbv2 deregister-targets
--target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:0123456789:targetgroup/target-group-name/abc123456789
--targets Id=i-0123456789,Port=80
--region ap-northeast-1
async: 600
poll: 300
##################################################
# yum update
##################################################
- name: upgrade all packages
yum:
name: "*"
state: latest
async: 180
poll: 60
##################################################
# reboot
##################################################
- reboot:
##################################################
# wait for connection
##################################################
- wait_for_connection:
##################################################
# register instances with elb
##################################################
- name: registering instances with elb
become: yes
shell: >
aws elbv2 register-targets
--target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:0123456789:targetgroup/target-group-name/abc123456789
--targets Id=i-0123456789,Port=80
--region ap-northeast-1
async: 180
poll: 60
2-4. Modification de ansible.cfg Spécifiez les options de configuration. Définissez host_key_checking = False pour désactiver le processus d'enregistrement des empreintes digitales dans known_inventory.
ansible.cfg
[defaults]
host_key_checking=False
3-1. Exécuter la version de docker Exécutez la commande dans le répertoire contenant le Dockerfile. Vous pouvez voir qu'il a été créé avec des images docker.
$ docker build -t ansible-demo .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ansible-demo latest abc123456789 21 seconds ago 603MB
4-1. Démarrage du conteneur Accédez au répertoire spécifié par WORKDIR et démarrez le conteneur avec docker run. L'explication des options est la suivante. -it: Assigne un pseudo terminal sur le conteneur et garde l'entrée standard ouverte -v: monter le répertoire hôte sur le conteneur -rm: supprimer automatiquement le conteneur en quittant
$ cd /usr/src/app
$ docker run -it --rm -v $(pwd):/usr/src/app ansible-demo /bin/bash
4-2. Exécution de la commande Ansible Exécutez la commande comme suit. Vous pouvez voir à partir de la console AWS que l'état du groupe cible s'épuise. Finalement, il a été de nouveau enregistré dans ELB, et il a été confirmé qu'il était sain.
root@abc012345:/usr/src/app# ansible-playbook -i ./inventory ./main.yml
PLAY [targets] ************************************************************************************
TASK [deregistering instances from elb] ***********************************************************
changed: [10.0.1.100]
TASK [upgrade all packages] ***********************************************************************
ok: [10.0.1.100]
TASK [reboot] *************************************************************************************
changed: [10.0.1.100]
TASK [wait_for_connection] ************************************************************************
ok: [10.0.1.100]
TASK [registering instances with elb]**************************************************************
changed: [10.0.1.100]
PLAY RECAP ****************************************************************************************
10.0.1.100 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0