设为首页 收藏本站
查看: 939|回复: 0

[经验分享] ansible 运维工具简单整理

[复制链接]

尚未签到

发表于 2018-7-30 08:06:21 | 显示全部楼层 |阅读模式
  1. ansible
  ansible是新出现的 自动化 运维工具 , 基于Python研发 。 糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。 仅需在管理工作站上安装 ansible 程序配置被管控主机的 IP 信息,被管控的主机无客户端。ansible 应用程序存在于 epel( 第三方社区 ) 源,依赖于很多 python 组件
  运维:Operations
  系统安装:
  bare metal:pxe, cobbler pxe(预执行环境)
  virtual machine:
  Configuration:
  puppet (ruby)
  saltstack (python)
  chef
  cfengine
  ...
  Command and Control:
  fabric
  func
  程序发布:
  人工智能(手动发布)
  脚本
  发布程序(运维程序)
  要求:
  1、不能影响用户体验;
  2、系统不能停机;
  3、不能导致系统故障或造成系统完全不可用;
  灰度模型:
  主机
  用户
  发布路径:
  /webapps/tuangou
  /webapps/tuangou-1.1
  /wepapps/tunagou-1.2
  在调度器上下线一批主机(标记为维护模式)--> 关闭服务 --> 部署新版本 --> 启动服务 --> 在调度器上启用这一批主机;
  ansible:
  Configuration
  Command and Control
  运维工个的分类:
  agent:puppet, func, ...
  agentless(ssh,):ansible, fabric
  特性:
  模块化:调用特定的模块,完成特定任务;
  基于Python语言实现,由Paramiko, PyYAML和Jinja2三个关键模块;
  部署简单:agentless;
  支持自定义模块;
  支持playbook;
  幂等性;
  安装:
  epel, ansible
  配置文件:/etc/ansible/ansible.cfg
  主机清单:/etc/ansible/hosts
  主程序:
  ansible
  ansible-playbook
  ansible-doc
  ansible的简单使用格式:
  ansible  HOST-PATTERN  -m MOD_NAME  -a  MOD_ARGS
  ansible-doc -s group
  基于ssh连接:使用秘钥认证
  生成秘钥:
  ssh-keygen -t rsa [-P ''] [-f “/root/.ssh/id_rsa"]
  将公钥copy到要连接的服务器,并在.ssh/authorized_keys
  ssh-copy-id 172.16.174.160
  ansible的常用模块: 注  “=”一般为必须给的参数
  获取模块列表:
  ansible-doc  -l
  ansible all -m ping
  command模块:在远程主机运行命令;
  模块省略为command  不支持管道
  ansible all -a "useradd testuser"
  shell模块:在远程主机在shell进程下运行命令,支持shell特性,如管道等;
  ansible all -m shell -a  'echo mageedu |passwd --stdin'
  一般用到管道 输入输出重定向时 使用shell模块
  copy模块: Copies files to remote locations.
  用法:
  (1) src=  dest=
  (2) content=  dest=
  owner, group, mode
  ansible all -m copy -a "src=  mode 600 dest="
  content='hello \n'
  ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab1"
  ansible all -m copy -a "content='hello' dest=/tmp/testfile"
  cron 模块:Manage cron.d and crontab entries.
  minute=
  day=
  month=
  weekday=
  hour=
  job=   '/sbin/ntpdate 172.16.174.100 > /dev/nuxll' name=Synctime
  *name=  必须指明
  cron_file
  state=
  present:创建
  absent:删除
  minute=*/5 job=   '/sbin/ntpdate 172.16.174.100 > /dev/nuxll' name=Synctime state=present
  实例:
  ansible all -m cron -a "minute=*/5 job='/sbin/ntpdate 172.16.174.100 &> /dev/null' name=Synctime"
  ansible all -m cron -a "state=Sync"
  fetch模块:Fetches a file from remote nodes
  pull 远程  src在远程注意的文件  dest
  file模块: Sets attributes of files
  用法:
  (1) 创建链接文件:*path=  src=  state=link   path 为 链接后的路径  src= 原文件的路径
  (2) 修改属性:path=  owner= mode= group=
  (3) 创建目录:path=  state=directory
  src=  path=/etc/file.link state=link
  hostname模块:Manage hostname
  name=
  变量 基于循环 多个主机命名
  pip模块:Manages Python library dependencies.
  远程主机自动安装 运行python所用到的工具
  yum模块:Manages packages with the `yum' package manager
  name=:程序包名称,可以带版本号;  默认最新版本
  state=
  present(最新), latest
  absent 删除
  ansible all -m yum -a "name=httpd state=latest" state=absent
  conf_file
  name=httpd state=latest
  安装好 把本地配置好的文件copy到其主机
  service模块:管理服务
  *name=
  state=
  started
  stopped
  restarted
  enabled=   开机自动启动
  runlevel=
  实例:ansible all -m service -a "name=httpd state=started enabled=true"
  uri
  url=
  user模块:管理用户账号 创建 删除 修改
  *name=
  system=yes|no
  uid=
  shell=
  group=
  groups=  附加组
  comment=    注释信息
  home=
  remove (删除用户的时候同时删除家目录)   move_home  state=absent
  setup模块:获取facts
  present 创建
  示例:ansible all -m user -a "name=user111 state=present system=yes uid=306"
  YAML:yet another markup language
  YAML:语法格式
  列表 字典:有两个键值对组合而成的就叫做字典(多个kv 对组成)同类的元素:- 可以嵌套(key下 还可以有key)
  列表     [1,2,3,4]
  字典     {1:mon,2:tue}  {1:mon,2:[red,bule,yellow]}
  packages:
  - httpd
  - php
  - php-mysql
  version:0.1
  Playbook的核心元素: 通过读取yaml格式的文件 playbook就是由一个或多个play组成的列表
  Hosts:
  Tasks:任务
  Variables: (自带的,自定义)
  Templates:包含了模板语法的文本文件;
  Handlers:由特定条件触发的任务;
  Roles:把hosts剥离出来,playbook 就成了角色
  playbook的基础组件:最基础 hosts tasks user
  Hosts:运行指定任务的目标主机; 一个多个冒号分割
  remo  te_user: 在远程主机上执行任务的用户;
  定义全局 也可以单任务指定 task
  sudo_user:临时切换
  tasks:任务列表  任务执行 第一个在所有主机运行完,再运行第二个任务
  模块,模块参数;
  格式:
  (1) action: module arguments 较新版本
  (2) module: arguments 通用(建议使用)
  注意:shell和command模块后面直接跟命令,而非key=value类的参数列表; command:
  (1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
  (2) 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;可以同时多个标签 中间用空格或,号 试一下
  ansible-playbook -t instconf web3.yaml
  运行playbook的方式:
  (1) 测试
  ansible-playbook  --check
  只检测可能会发生的改变,但不真正执行操作;
  ansible-playbook  --list-hosts
  列出运行任务的主机;
  ansible 172.16.174.167 -m setup
  (2) 运行
  ansible-playbook first.yaml
  实例:
  - hosts: all
  remote_user: root
  tasks:
  - name: createuser3
  user: name=user3 system=yes uid=308
  - name: createuser4
  user: name=user4 system=yes uid=309
  实例:
  - hosts: websrv
  remote_user: root
  tasks:
  - name: install httpd package
  yum: name=httpd state=present
  - name: install configure file
  copy: src=files/httpd.conf dest=/etc/httpd/
  - name: start httpd service
  service: name=httpd state=started enabled=true
  - name: execute ss command
  shell: ss -tanl |grep :80
  实例
  - hosts: websrv
  remote_user: root
  tasks:
  - name: install httpd package
  yum: name=httpd state=present
  - name: install configure file
  copy: src=files/httpd.conf dest=/etc/httpd/conf/
  notify: restart httpd
  - name: start httpd service
  service: name=httpd state=started enabled=true
  #  - name: execute ss command
  #    shell: ss -tanl |grep :80
  handlers:
  - name: restart httpd
  service: name=httpd state=restarted
  可以将shell命令的结果重定向到文件当中。
  handlers:
  任务,在特定条件下触发;(一般为在配置文件修改时,触发某动作执行)
  接收到其它任务的通知时被触发;
  variables:
  (1) facts:可直接调用;setup模块提供的:
  (2) ansible-playbook命令的命令行中的自定义变量:`pname`调用变量
  -e VARS, --extra-vars=VARS
  (3) 通过roles传递变量;
  (4) Host Inventory (hosts中定义 实现不同主机拥有不同变量)
  (a) 向不同的主机传递不同的变量;
  IP/HOSTNAME  varaiable=value var2=value2   hname=www2
  实例: (1)[websrv]
  172.16.174.160 hname=www1
  172.16.174.177 hname=www2
  [websrv:vars]
  http_port=80
  (2)ansible websrv -m hostname -a "name=` hname `"
  (b) 向组中的主机传递相同的变量;
  [groupname:vars]
  variable=value    http_port=8080
  在 ansible 中 hosts
  注意:invertory参数:
  用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
  ansible_ssh_host
  ansible_ssh_port
  ansible_ssh_user
  ansible_ssh_pass
  ansbile_sudo_pass  **
  ...
  回顾:运维工具,ansible
  运维工具:
  OS Provision:pxe, cobbler,
  Configuration: puppet, saltstack, chef, cfengine, ...
  Command and Control:fabric, func
  Deployment:
  灰度升级 lvs 权重为weight=0 nginx upstreem server  down(注意是否为长连接,查看老的会话是否已经断开连接;keepalive时间超时)
  ansible: agentless, ssh
  sudo user 注意
  ansible
  ansible-playbook
  模块:command, shell, cron, copy, file, ping, yum, service, user, setup, hostname, group, script
  playbook基本组件:
  hosts
  remote_user 以哪个用户的身份运行
  tasks
  handlers
  variables
  templates
  roles
  ansible(2)
  模块:
  group模块:添加或删除组
  *name=
  state=
  system=
  gid=
  script模块:
  -a "/PATH/TO/SCRIPT_FILE"
  将本地的某个脚本传递到远程主机时执行:ansible websrv -m script -a "/.."
  template模块:基于模板方式生成一个文件复制到远程主机
  *src=
  *dest=
  owner=
  group=
  mode=
  *必备参数
  playbook的其它组件
  变量:
  ansible facts
  ansible-playbook  -e "var=value" (varname=value)
  host variable: host iventory
  group variable 主机组
  [groupname:vars]
  var=value
  roles
  在vars 目录下:usrname: daemon
  使用时在 templates 调用即可
  调用:` variable `
  insible-playbook -t instconf -e"username=adm" --check nginx.xml
  在playbook中定义变量的方法:
  vars:
  - var1: value1
  - var2: value2
  模板:templates
  文本文件,嵌套有脚本(使用模板编程语言编写)
  Jinja2(python 的模板编程语言):
  字面量:
  字符串:使用单引号或双引号;
  数字:整数,浮点数;
  列表:[item1, item2, ...] 可变的
  元组:(item1, item2, ...) 不可变
  字典:{key1:value1, key2:value2, ...} key不一般为字符串 “keys”
  布尔型:true/false
  算术运算:
  +, -, *, /, //(除完只留商), %, **(次方)
  比较操作:
  ==, !=, >, >=, <, <=
  逻辑运算:
  and, or, not
  示例:
  - hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx
  yum: name=nginx state=present
  - name: install conf file
  template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx
  tags: instconf
  - name: start nginx service
  service: name=nginx state=started
  handlers:
  - name: restart nginx
  service: name=nginx state=restarted
  模板配置文件 :nginx.conf.j2
  worker_processes ` ansible_processor_vcpus `;
  listen ` http_port `;
  条件测试:
  when语句:在task中使用,jinja2的语法格式(字符串加引号;数字不加引号)
  tasks:
  - name: install conf file to centos7
  template: src=files/nginx.conf.c7.j2
  when: ansible_distribution_major_version ==     "7"
  - name: install conf file to centos6
  template: src=files/nginx.conf.c6.j2
  when: ansible_distribution_major_version == "6"
  循环:迭代,需要重复执行的任务;
  对迭代项的引用,固定变量名为”item“
  而后,要在task中使用with_items给定要迭代的元素列表;
  列表方法:
  字符串
  字典:key value
  - name: install some packages
  yum: name=` item ` state=present
  with_items:
  - nginx
  - memcached
  - php-fpm
  - name: add some groups
  group: name=` item ` state=present
  with_items:
  - group11
  - group12
  - group13
  - name: add some users
  user: name=` item`.`name ` group=` item`.`group ` state=present
  with_items:
  - { name: 'user11', group: 'group11' }
  - { name: 'user12', group: 'group12' }
  - { name: 'user13', group: 'group13' }
  角色(roles):
  角色集合:
  roles/ 角色名就是目录名
  mysql/
  httpd/
  nginx/
  memcached/
  每个角色,以特定的层级目录结构进行组织: 角色是与主机分离的,谁用谁调用,只代表一种功能
  mysql/
  files/ :存放由copy或script模块等调用的文件;
  templates/:template模块查找所需要模板文件的目录;
  tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
  handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
  vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
  meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
  default/:设定默认变量时使用此目录中的main.yml文件;
  在playbook调用角色方法1:
  - hosts: websrvs
  remote_user: root
  roles:
  - mysql
  - memcached
  - nginx
  在playbook调用角色方法2:传递变量给角色(可以覆盖vars下同名的变量)
  - hosts:
  remote_user:
  roles:
  - { role: nginx, username: nginx }
  键role用于指定角色名称;后续的k/v用于传递变量给角色;
  还可以基于条件测试实现角色调用;
  roles:
  - { role: nginx, when: "ansible_distribution_major_version == '7' " }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543297-1-1.html 上篇帖子: 自动化运维工具Ansible架构部署应用及playbooks简单应用 下篇帖子: Ansible安装及简单应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表