Ansible 使用

在学习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的安装和使用

  • 视频

B站-视频学习地址

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各类系统的不了解,导致在非指定系统使用对应的命令,单纯的反复尝试,导致浪费时间,应先从底层知识了解系统之间区别,在指定的系统使用对应的命令,能保障流程的正常进行,不会被阻塞

  • 安装方式
  1. 由于安装方式很多,开始采取git源码方式安装,踩坑很多,反复排查问题,浪费了很多时间;
    建议使用Horebrew方式,一行代码,完成所有安装
  • 版本不一致问题
  1. Python 和 Pip版本未对应,导致反复下载和安装,浪费了时间
  • OSX系统,配置文件需要自己生成,并通过复制Github的配置文件

Ansible常用模块

Ansible的PlayBook安装Docker[Ubuntu14]

PlayBook安装Docker - 学习地址
PlayBook基础了解

  • 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
  • 遇到的问题记录
  1. 不了解Play Book的语法(摆脱混子心态,主动学习,新手刚开始不需要理解多么透彻,至少要看懂)

网络查询到的资料,通过盲目尝试,写脚本,变成了猜脚本
了解一些yaml的一些基础入法,例如:----、tasks、hosts等

  1. 版本不匹配导致,频繁报错(控制情绪,理性面对很重要,要有解决问题的思路)

先确定自己的系统是 CentOS 还是 Ubuntu
确定自己的系统版本,Ubuntu 18或者14
找好对应版本的安装教程, 再根据Shell内容,转换成playbook内容
执行playbook

报错类型:
安装命令 CentOs是yum、Ubuntu是apt
Ubuntu18的python版本是3.X,Ubuntu14的默认python版本是python14
docker仓库,Ubuntu14对应的trust版本,18对应的是bionic,注意区分

Ubuntu和Docker仓库对应关系

Ansible的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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容