## 什么是 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