跳至主要內容
Ansible-基础知识
  • 常用自动化运维工具
    • Ansible : python
    • saltstack : python , 一版需要部署agent
    • puppet: ruby 功能强大,配置复杂,重型,适合大型环境
  • 特性:
    • 模块化:调用特定的模块,完成特定任务
    • 有paramiko,pyaml,jinja2(模版语言)三个关键模块
    • 支持自定义模块
    • 基于python 语言实现
    • 部署简单,基于python和ssh,agentless
    • 安全,基于openssh
    • 支持基于platbook 编排任务
    • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
    • 无需代理不依赖pki(无需ssl)
    • 可食用任何编程语言写模块
    • Yaml格式,编排任务,支持丰富的数据结构
    • 较强大的多层解决方案
  • 架构

HFwas...大约 2 分钟ansibleansible
Ansible-基础命令
  • Ansible系列命令

    • ansible ansible-doc ansible-playbook ansible-vault
    • ansible-console ansible-galaxy ansible-pull
  • ansible-doc:显示模块帮助

    • ansible-doc [options][module...]
    • -a 显示所有模块的文档
    • -l,--list 列出可用模块
    • -s,-snippets显示指定模块的playbook片段
    • 示例:
      • ansible-doc列出所有模块
      • ansible--doc ping查看指定模块帮助用法
      • ansible-doc-s ping查看指定模块帮助用法
  • Ansible:通过ssh实现配置管理、应用部署、任务执行等功能,建议配置Ansible端能基于密钥认证的方式联系各被管理节点

  • ansible host-pattern -m module_name -a args

    • -version显示版本
    • -m module指定模块,默认为command
    • -V详细过程-VW-W更详细
    • -list-hosts显示主机列表,可简写--list
    • -k,--ask-pass 提示输入ssh连接密码,默认Key验证
    • -K,-ask-become-pass提示输入sudo时的口令
    • -C,-check检查,并不执行
    • -T,-timeout=TIMEOUT执行命令的超时时间,默认10s
    • -u,-user=REMOTE_USER执行远程执行的用户
    • -b,-become代替I旧版的sudo切换
  • Ansible 的host-pattern 匹配主机的列表

    • All:表示所有Inventory中的所有主机
      • ansible all -m ping
    • *:通配符
      • ansible "*" -m ping
      • ansible 192.168.1.*-m ping
      • ansible "*srvs" -m ping
    • 或关系
      • ansible "websrvs:appsrvs"-m ping
      • ansible"192.168.1.10:192.168.1.20" -m ping
    • 逻辑与
      • ansible "websrvs:&dbsrvs"-m ping
      • 在websrvs组并且在dbsrvs组中的主机
    • 逻辑非
      • ansible 'websrvs:!dbsrvs'-m ping
      • 在websrvs组,但不在dbsrvs组中的主机
      • 注意:此处为单引号
    • 综合逻辑
      • ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs'-m ping
    • 正则表达式
      • ansible "websrvs:&dbsrvs"-m ping
      • ansible "~(webdb).*.magedu.com"-m ping
  • ansible命令执行过程

    • 1.加载自己的配置文件默认/etc/ansible/ansible.cfg

    • 2.加载自己对应的模块文件,如command

    • 3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件

    • 4.给文件+x执行

    • 5.执行并返回结果

    • 6.删除临时py文件,sleep 0退出

    • 可以执行命令后加--vvv

    • 执行状态:

      • 绿色:执行成功并且不需要做改变的操作
      • 黄色:执行成功并且对目标主机做变更
      • 红色:执行失败
    • 示例

      • 以wang用户执行ping存活检测
        • ansible all -m ping-u wang -k
      • 以wang sudo3至root执行ping存活检测
        • ansible all -m ping-u wang-b-k
      • 以wang sudo?至mage用户执行ping存活检测
        • ansible all-m ping-u wang-b-k--become-user mage
      • 以wang sudo至root用户执行ls
        • ansible all -m command -u wang--become-user=root-a 'ls/root'-b-k-K

HFwas...大约 2 分钟ansibleansible
Ansible-常用模块
  • Command:在远程主机执行命令,默认模块,可忽略-m选项
    • ansible srvs -m command -a 'service vsftpd start'
    • ansible srvs -m command-a 'echo magedu | passwd --stdin wang' 不成功
    • 比命令不支持SVARNAME < > I ; &等,用shell模块实现
  • Shell:和command相以,用shell执行命令
    • ansible srv -m shell -a 'echo magedu |passwd --stdin wang'
    • 调用bash执行命令类以 cat /tmp/stanley.md | awk -F '|' ''{print $1,$2}' &> /tmp/example.txt这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
  • Script:运行脚本
    • -a "/PATH/TO/SCRIPT_FILE"
    • ansible websrvs -m script -a f1.sh
  • Copy:从服务器复制文件到客户端,
    • ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600. backup=yes” 如目标存在,默认覆盖,此处指定先备份
    • ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt”利用内容,直接生成目标文件
  • Fetch:从客户端取文件至服务器端,copy相反,目录可先tar
    • ansible srv -m fetch-a 'src=/root/a.sh dest=/data/scripts'
  • File:设置文件属性
    • ansible srv-m file-a "path=/root/a.sh owner=wang mode=755"
    • ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
  • Hostname:管理主机名
    • ansible node1 -m hostname -a "name=websrv"
  • Cron:计划任务
    • 支持时间:minute,hour,day,month,weekday
    • ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null name=Synctime” 创建任务
    • ansible srv-m cron-a'state=absent name=:Synctime' 删除任务
  • yum:管理包
    • ansible srv -m yum -a 'name=httpd state=latest'
    • ansible srv -m yum -a 'name=httpd state=absent'
  • Service:管理服务
    • ansible srv -m service-a 'name=httpd state=stopped'
    • ansible srv -m service -a 'name=httpd state=started'
    • ansible srv -m service -a 'name=httpd state=reloaded'
    • ansible srv -m service -a 'name=httpd state=restarted'
  • User:管理用户
    • ansible srv -m user -a 'name=user1 comment="test user"uid=2048 home=/app/user1 group=root
    • ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
    • ansible srv -m user -a 'name:=user1 state=:absent remove=:yes'删除用户及家目录等数据
  • Group:管理组
    • ansible srv -m group -a "name=testgroup system=yes"
    • ansible srv -m group -a "name=testgroup state=absent"
  • lineinfile模块:针对一个文件当中行内容的修改
    • 更新行内容:ansible test1 -m lineinfile -a "path=/etc/ssh/sshd_conf regex='^PermitRootLogin' line='PermitRootLogin no'"
    • 插入行内容:ansible test1 -m lineinfile -a "path=/etc/ssh/sshd_conf insertafter='7755$' line='Port 22'"
  • authorized_key模块:对虚拟机批量互信

HFwas...大约 2 分钟ansibleansible
Ansible-Playbook

ansible-galaxy

  • ansible-galaxy

    • 连接https://galaxy.ansible..com下载相应的roles
    • 列出所有已安装的galaxy
      • ansible-galaxy list
    • 安装galaxy
      • ansible-galaxy install geerlingguy.redis
    • 删除galaxy
      • ansible-galaxy remove geerlingguy.redis
  • ansible-pull

    • 推送命令至远程,效率无限提升,对运维要求较高
  • Ansible-playbook


HFwas...大约 7 分钟ansibleansible
Ansible-Template
  • 文本文件,嵌套有脚本(使用模板编程语言编写)

  • jinja2语言,使用字面量,有下面形式

    • 字符串:使用单引号或双引号
    • 数字:整数,浮点数
    • 列表:[item1,item2,]
    • 元组:(item1,item2,)
    • 字典:{key1:value1,key2:value2,…}
    • 布尔型:true/false
  • 算术运算:+,- ,*,/,//,%,**

  • 比较操作:==,!=,>,>=,<,<=

  • 逻辑运算:and,or,not

  • 流表达式:For If When


HFwas...大约 2 分钟ansibleansible
Ansible-Role
  • roles

    • ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织olaybook.。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
  • 复杂场景:建议使用roles,代码复用度高

    • 变更指定主机或主机组
    • 如命名不规范维护和传承成本大
    • 某些功能需多个Playbook,通过Includes即可实现

HFwas...小于 1 分钟ansibleansible
Ansible-实操

批量更新用户密码

---
- hosts: system
  tasks:
    - name: update user password
      user: name={{ item.name }} password={{ item.password | password_hash('sha512')}} update_password=always
      with_items:
      	- name: root
      	  password: aaa
      	- name: admin
      	  password: 123

HFwas...小于 1 分钟ansibleansible