在学习Ansible的时候,首先明确是通过
主控端
来控制被控端
的概念
明确部署也是在主服务器中部署,而非本机
另外:建议在学习Ansible前,建立好需要管理服务器的Vagrant的互信机制
学习目的
- 了解Ansible:What's Ansible?
- Ansible的环境搭建:Ansible在Ubuntu系统下的安装
- 了解Ansible配置:Hosts文件里的
被控机
的配置 - 熟悉Ansible的命令使用:批量执行模块、批量执行shell脚本
- 熟悉Ansible的playbook使用: 安装Docker
学习地址
- 文档
Ubuntu系统Ansible的安装和使用
Ansible的安装-OSX系统
Ansible的配置
Ansible中文权威指南
多版本Python和Pip安装
Ansible批量执行命令
OS X和UBuntu系统的Ansible的安装和使用
- 视频
Ansible的作用
一个主机控制多台主机(生产上,存在多台虚拟服务器需要,作为统一管理的工具)
主控端、被控端(SSH)
控制工具 | 适合场景(管理的被控端台数) | 备注 |
---|---|---|
Ansible | 中小型应用 | |
Saltstack | 效率高 | |
Puppet | 中大型应用 |
Ansible的安装
- Ubuntu系统的安装
// 1. software-properties-common的安装
sudo apt update
sudo apt install software-properties-common
// 2. 添加PPA,需要点击`enter`按键才能通过
sudo apt-add-repository ppa:ansible/ansible
// 3. 刷新索引
sudo apt update
// 4. 开始安装ansible
sudo apt install ansible
- OS X系统的安装(忽略,并不能成功,难受)
// 已有Python的情况下
// 1. 安装pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
// 或者 下载最新版本,可能和当前python版本不配对
sudo easy_install pip
// 检测pip的安装
pip --version
// 2. 安装pip模块
sudo pip install paramiko PyYAML Jinja2 httplib2 six
// 3. Homebrew 安装方式(推荐:简单无脑好用,适合我这种小白)
brew install ansible
// 3. git源码方式安装ansible(坑比较多,版本对应,以及配置文件生成等,导致反复排查问题)
git clone https://github.com/ansible/ansible.git --recursive
cd ansible
git pull --rebase
git submodule update --init --recursive
// 4. 配置Bash(Git源码安装方式)
source ./hacking/env-setup
// 5. 检测ansible安装
ansible --version
Ansible的配置
- 配置VM组
# 1. 编辑 /etc/ansible/hosts
文件: `/etc/ansible/hosts/`
sudo vim /etc/ansible/hosts/
添加VM组内容 eg:
# 这里是命名组,后面可以直接通过`test_group`来直接操作`被控机`
[test_group]
172.16.1.102
172.16.1.103
# 2. 如需,编辑 /etc/ansible/ansible.cfg
文件: `/etc/ansible/ansible.cfg`
sudo vim /etc/ansible/hosts/
Ansible的使用
- 批量Shell命令的执行
// 1. 完成Ansible的VM组 配置
# 编辑 /etc/ansible/hosts
文件: `/etc/ansible/hosts/`
sudo vim /etc/ansible/hosts/
添加VM组内容 eg:
# 这里是命名组,后面可以直接通过`test_group`来直接操作`被控机`
[test_group]
172.16.1.102
172.16.1.103
[test_group:vars]
ansible_ssh_pass="123456" // 登陆密码
# 添加互信
[root@ansible-server ~]# ssh-keygen -t rsa //一路回车
[root@ansible-server ~]# ls .ssh/ // 这里是root代表根目录,如果在根目录直接 .ssh/即可,我这里删除了ls /root/.ssh/
id_rsa id_rsa.pub
// 完成单个`被控机`的互信
ssh-copy-id -i ~/.ssh/id_rsa.pub username@[ip,hostname]
//(shell脚本批量执行)批量完成Hosts配置`被控机`的互信 | 注意:这里的/root/代表根目录,不一定需要,我这里删除了 /root/.ssh/
ansible ssh-host -m copy -a "src=.ssh/id_rsa.pub dest=.ssh/authorized_keys mode=600"
// (shell脚本2选1即可,不用重复执行)使用ansible playbook脚本执行批量添加互信
ansible ssh-copy.yml
// 2 “服务器”组中的所有服务器以root用户身份进行连接 , 如果没有配置用户权限到每一个`被控机`,就要使用Root用户`(添加互信以后)`
sudo mkdir /etc/ansible/group_vars
sudo nano /etc/ansible/group_vars/servers
// yarm语言以`---`为开始
---
ansible_ssh_user: root
// 3. 使用简单的Ansible命令
# ping在`/etc/ansible/hosts/`里面配置的所有服务器ip
ansible -m ping all
# 使用sheel脚本
ansible -m shell -a 'free -m' test_group
// 4. 输出展示
# ansible -m ping all
172.16.1.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.103 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
# ansible -m shell -a 'free -m' test_group
172.16.1.102 | CHANGED | rc=0 >>
total used free shared buffers cached
Mem: 993 202 791 0 11 68
-/+ buffers/cache: 122 871
Swap: 0 0 0
172.16.1.103 | CHANGED | rc=0 >>
total used free shared buffers cached
Mem: 993 212 781 0 12 77
-/+ buffers/cache: 122 871
Swap: 0 0 0
- 批量添加互信的Ansible Playbook的内容记录
---
- hosts: ssh-host
# 互信用户
user: root
tasks:
- name: ssh-copy
authorized_key: user=vagrant key="{{ lookup('file', '.ssh/id_rsa.pub') }}"
Ansible的原理
基于python和SSH实现
安全基于 openSSH
Ansible安装遇到的问题总结
- 系统混装(在Ubuntu系统上,使用CentOs系统的命令)
由于对linux各类系统的不了解,导致在非指定系统使用对应的命令,单纯的反复尝试,导致浪费时间,应先从底层知识了解系统之间区别,在指定的系统使用对应的命令,能保障流程的正常进行,不会被阻塞
- 安装方式
- 由于安装方式很多,开始采取git源码方式安装,踩坑很多,反复排查问题,浪费了很多时间;
建议使用Horebrew
方式,一行代码,完成所有安装
- 版本不一致问题
- Python 和 Pip版本未对应,导致反复下载和安装,浪费了时间
- OSX系统,配置文件需要自己生成,并通过复制Github的配置文件
Ansible常用模块
- 学习地址
Ansible常用模块介绍 - 华为云
Ansible的PlayBook安装Docker[Ubuntu14]
- Shell脚本安装
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
- playbook批量安装
---
- hosts: all
become: yes
become_method: sudo
become_user: root
tasks:
- name: Install aptitude using apt
apt: name=aptitude state=latest update_cache=yes force_apt_get=yes
- name: install neccessary system tools
apt: name={{ item }} state=latest update_cache=yes
loop: ['apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common']
- name: install GPG cetification
apt_key:
url: http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb http://mirrors.aliyun.com/docker-ce/linux/ubuntu trusty stable
state: present
update_cache: yes
- name: Update apt and install docker-ce
apt: update_cache=yes name=docker-ce state=latest
- 遇到问题使用的一些命令
// 1. 查看可安装的docker-ce版本
sudo apt-cache madison docker-ce
// 2. 查看缓存仓库的内容
sudo nano /etc/apt/sources.list
- 遇到的问题记录
- 不了解Play Book的语法(摆脱混子心态,主动学习,新手刚开始不需要理解多么透彻,至少要看懂)
网络查询到的资料,通过盲目尝试,写脚本,变成了猜脚本
了解一些yaml的一些基础入法,例如:---
、-
、tasks、hosts等
- 版本不匹配导致,频繁报错(控制情绪,理性面对很重要,要有解决问题的思路)
先确定自己的系统是 CentOS 还是 Ubuntu
确定自己的系统版本,Ubuntu 18或者14
找好对应版本的安装教程, 再根据Shell内容,转换成playbook内容
执行playbook
报错类型:
安装命令 CentOs是yum、Ubuntu是apt
、
Ubuntu18的python版本是3.X,Ubuntu14的默认python版本是python14
、
docker仓库,Ubuntu14对应的trust版本,18对应的是bionic,注意区分
Ansible的Roles格式结构学习
-
学习地址
Roles介绍 什么是Roles
顾名思义,角色;在剧本里,给某个人某个角色,使TA拥有一些特殊技能,如果TA需要多个特殊技能,只要通过分配给TA多个角色即可。
反映到我们的DevOps上,则是通过Role做不同的事情,例如: 安装Docker、安装web、安装PHP等,每个不能类型软件的安装,可以认为是一个角色,通过分配角色的方式,来通过Play book去完成
批量
、指定命令
、指定VM
的执行,而无需重复的Play book去执行
- Roles格式结构
// 1. 创建Roles目录
[root@node1 opt]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}
// 2. Profiler
role名: websrvs,dbsrvs
构成: tasks,files,templates,meta,handlers,vars // 理解主要是用于分包,且是固定方式的分包
编写yml都是在对应文件下,创建main.yml进行编写
// 3. Introduction
tasks:外部引用role模块时候导入的tasks任务,使用inculde,做task1.yml、task2.yml、etc.的拆分
# main.yml文件内容
- incloud:
yum.yml
pip.yml
vars:存储属于这个role模块的变量
# vars/main.yml文件内容
repo_url: https://github/com/xiaopeng163、flask-ansible_demo
# tasks/main.yml文件内容 `{{ }}`框住可以使用变量
- name: checkout sourcec code from github:
git:
repo: "{{ repo_url}}"
dest: ~/flask-ansibsle-demo
defaults:用来存放一些默认的变量
files: 存放一些文件,可以被当前的tasks文件夹中的任务直接使用
template:用来存放一些Jinj2模板文件,与files文件夹含义相同
handlers:放置的是一个ansible的完整的task。在main.yml文件中使用notify关键字去告诉handle,该执行你这个handle了
handles的作用:
通知服务的重启,因为目标发生改变了,那么这个task必然会被执行。
handles也可以定义在play-book文件中,只要和tasks同级即可。
# 一个play-book文件,如何调用handler中的task
---
- hosts: test
remote_user: dwchensenwen
become: yes
become_method: sudo
tasks:
- name: make file task1
file: path=/data/task1.txt state=touch
notify: task1
- name: make file task2
file: path=/data/task2.txt state=touch
notify: task2
handlers:
- name: task1
file: path=/data/1.txt
state: touch
- name: task2
file: path=/data/2.txt
state: touch