美文网首页
Ansible 使用

Ansible 使用

作者: 超级呆 | 来源:发表于2021-06-30 12:37 被阅读0次

    在学习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
    

    相关文章

      网友评论

          本文标题:Ansible 使用

          本文链接:https://www.haomeiwen.com/subject/ychqultx.html