ansible简介
一款轻量级的自动化运维软件
为什么用ansible
- Chef
Ruby 语言编写,C/S架构,配置需要Git依赖,Recipe脚本编写规范,需要一定编程经验 - Saltstack
Python编写,C/S架构,模块化,YAML脚本编写规范,适合大规模集群部署 - Ansible
Python编写,agentless(无客户端),模块化管理,Playbook脚本编写规范,易于上手,适合中小规模快速部署,对敏捷开发十分友好
安装
两种方式实现安装
- yum安装(yum -y install ansible )
- git clone https://github.com/ansible/ansible.git
这里我们采用 python3.6.5 + Virtualenv + ansible2.5 安装ansible,使用虚拟环境的好处在这里不必多说。
1. 安装Python3.6 和 pip
2. 安装 virtualenv
# pip install virtualenv
3. 创建ansible账户并安装python3.6版本virtualenv实例
# useradd deploy && su - deploy
# virtualenv -p /usr/local/bin/python3 .py3-a2.5-env # 在 deploy 账户家目录下创建了名叫 .py3-a2.5-env 的虚拟环境
4. git 源代码安装ansible2.5
# cd /home/deploy/.py3-a2.5-env
# git clone https://github.com/ansible/ansible.git
# cd ansible && git checkout stable-2.5
5. 加载python3.6 virtualenv 环境
# source /home/deploy/.py3-a2.5-env/bin/activate
6. 安装ansible依赖包
# pip install paramiko PyYAML jinja2
7. 在python3.6虚拟环境下加载ansible2.5
# source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q
8. 验证 ansible2.5
# ansible --version
playbooks 框架格式
单看图可能会有些懵逼,下面我们来详细解释
1. 创建一个 testplaybooksd 目录
# mkdir /home/deploy/testplaybooks
2. 进入 testplaybooks 目录
(1) 创建 inventory # 这个目录就可以用来放我们需要进行管理的主机清单
# mkdir inventory
(2) 创建roles目录 # 这个目录就是用来存放具体任务的
# mkdir roles
(3) 在inventory 里面创建一个 testenv文件 # 这个文件里就定义了被管理主机的一些信息和变量
vim inventory/testenv
[testservers] # 定义主机可以一个或多个
test.example.com
[testservers:vars] # 定义变量,用法后面会讲到
server_name=test.example.com
user=root
output=/root/test.txt
(4) 在roles下创建 testbox 并在 testbox 下创建tasks 用来存放具体任务
# mkdir roles/testbox/tasks
(5) 到 tasks 目录下面创建 main.yml 文件用来编写我们需要在被管理主机上执行的任务
cd roles/testbox/tasks
vim mail.yml
- name: print server name and user to remote testbox
shell: "echo 'current {{user}} is logging {{server_name}}'" > {{output}}
# 在这里,任务名字就是就是我们定义的name后面的内容,而第二行就代表 我们使用ansible的shell模块去打印这句话并追加到我们定义的文件中,
#这里的{{user}},{{server_name}},{{output}}就是我们在 testenv #中定义的变量,{{变量名}} 是固定写法
(6) 最后我们在我们的主目录 testplaybooks 中,编写 deploy.yml 脚本作为我们执行任务的入口
vim deploy.yml
- hosts: "testservers" # 这里的 testservers 就是我们在 testenv 中定义的被管理主机
gather_facts: true # 参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息
remote_user: root # 指定被管理主机的用户
roles:
- testbox # 指定任务
3. so,我们定义的目录结构用树状图表示就是这样的
.
├── deploy.yml
├── inventory
│ └── testenv
└── roles
└── testbox
│
├── tasks
│ └── main.yml
4. 接下来,执行我们的 YML 任务
ansible-playbook -i inventory/testenv deploy.yml
5. 看到如下输出结果,就代表执行成功
(.py3-a.2.5-env) [deploy@centos7-05 testplaybooks]$ ansible-playbook -i inventory/testenv deploy.yml
PLAY [testservers] *************************************************************
TASK [Gathering Facts] *********************************************************
ok: [test.example.com]
TASK [testbox : print server name and user to remote testbox] ******************
changed: [test.example.com]
PLAY RECAP *********************************************************************
test.example.com : ok=1 changed=1 unreachable=0 failed=0
6. 到 test.example.com 这台主机下验证
cat /root/test.txt
current deploy is logging test.example.com
7. 完成