## 什么是 Ansible Ansible 是一种开源的自动化工具,主要用于配置管理、应用部署、任务自动执行以及多节点编排。由于它简单易用且无需在管理节点上安装大量软件,Ansible 在自动化管理领域中非常受欢迎。 ## 安装 Ansible ### 在 Ubuntu 上安装 ```Shell $ sudo apt update $ sudo apt install ansible -y ``` ### 在 MacOS 上安装 ``` $ brew install ansible ``` ### 使用 Docker 镜像运行 通过 Docker 构建自己的 Ansible 运维环境,如下所示的 `Dockerfile` 文件,其中包含了Ansible 和一些基本工具。 ```Dockerfile FROM ubuntu:22.04 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt update && \ apt install -y iputils-ping net-tools dnsutils tcpdump ca-certificates lsb-release gnupg wget ssh openssh-server python3 python3-pip git vim sudo ansible zsh curl RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" RUN sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="afowler"/' /root/.zshrc RUN echo "export xxx=xxx" > /root/.bash_profile RUN echo "source ~/.bash_profile" >> /root/.zshrc RUN chsh -s $(which zsh) WORKDIR /root CMD ["zsh"] ``` ### 运行 Ansible Docker 镜像 使用 Docker compose 运行自己的 Ansible 运维环境 ```yaml version: '3.8' services: my-devops: image: my-devops:latest container_name: my-devops hostname: my-devops restart: always tty: true volumes: - /etc/hosts:/etc/hosts:ro - ${HOME}/.ssh:/root/.ssh:ro - ${HOME}/.bash_profile:/root/.bash_profile:ro working_dir: /root/ ``` ## Ansible Playbook Ansible Playbook 是 Ansible 自动化工具中的一个核心组件,用于定义和执行系统配置、软件部署任务。 ### 运行 Docker Compose 示例代码 1. 创建保存 `inventory.ini` 文件 ```ini [my-server] server-1 ansible_host=x.x.x.x ansible_port=22 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa server-2 ansible_host=x.x.x.x ansible_port=22 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa ``` 2. 创建保存 `playbook/docker.yml` ``` - name: Deploy Proxy hosts: all become: yes tasks: - name: Docker compose login ansible.builtin.shell: cmd: docker login -u "{{ lookup('env', 'DOCKER_USERNAME') }}" -p "{{ lookup('env', 'DOCKER_PASSWORD') }}" "{{ lookup('env', 'DOCKER_REGISTRY') }}" args: executable: /bin/bash chdir: "~" - name: Docker compose file copy to temp ansible.builtin.copy: src: "../docker-compose/{{ docker_compose }}" dest: ~/temp/ directory_mode: 0755 mode: 0644 - name: Docker compose pull in temp ansible.builtin.shell: cmd: docker compose pull args: executable: /bin/bash chdir: "~/temp/{{ docker_compose }}" - name: Docker compose file exists in the apps directory ansible.builtin.stat: path: "~/apps/{{ docker_compose }}" register: result_directory - name: Docker compose stop and up by dir exists ansible.builtin.shell: | docker compose stop docker compose rm -f rm -rf ~/apps/{{ docker_compose }} mv ~/temp/{{ docker_compose }} ~/apps/ cd ~/apps/{{ docker_compose }} docker compose up -d args: executable: /bin/bash chdir: "~" when: - result_directory.stat.exists - name: Docker compose stop and up by dir no exists ansible.builtin.shell: | mv ~/temp/{{ docker_compose }} ~/apps/ cd ~/apps/{{ docker_compose }} docker compose up -d args: executable: /bin/bash chdir: "~" when: - result_directory.stat.exists == false ``` 3. 创建 `docker-compose/test` 目录和 `docker-compose/test/docker-compose.yaml` 文件 4. 运行 ```shell $ ansible-playbook -i inventory.ini playbook/docker.yml -e "docker_compose=test" -l "server-1" ``` ## 参考 - https://docs.ansible.com/ansible/latest/installation_guide/index.html