Linux九阴真经之九阴白骨爪残卷4(自动化运维之ansible用法一)

ansible是什么?

 

ansible是什么?

它是一个配置管理工具,也是一个自动化运维工具。

ansible能做什么?

ansible 可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。

比如:同时在200台服务器上安装dhcp服务,并启动。

比如:将某个文件一次性拷贝到200台服务器上

比如:每当有新服务器加入工作环境时,你都啊哟为新服务器部署redis服务,也就是说你需要经常重复的完成相同的工作。

特性

1、模块化:调用特定的模块,完成特定任务


2、有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块


3、支持自定义模块


4、基于Python语言实现


5、部署简单,基于python和SSH(默认已安装),agentless


6、安全,基于OpenSSH


7、’支持playbook编排任务


8、幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况


9、无需代理不依赖PKI(无需ssl)


10、可使用任何编程语言写模块


11、YAML格式,编排任务,支持丰富的数据结构

ansible 配置文件

ansible 配置文件                                       /etc/ansible/ansible.cfg (一般保持默认)

主机列表配置文件                                     /etc/ansible/hosts

库文件存放目录                                         /usr/share/my_modules

检查对应服务器的host_key,建议启用,取消注释

日志文件                                                    /var/log/ansible.log

临时py命令文件存放在远程主机目录        $HOME/.ansible/tmp

本机的临时命令执行目录                           $HOME/.ansible/tmp

默认并发数                                                 forks = 5

默认sudo 用户                                            sudo_user = root

每次执行ansible命令是否询问ssh密码       ask_sudo_pass = True

ask_sudo_pass = True

remote_port = 22

基础配置

实验环境:一台centos7.4的主控机和2台centos6.9的受控机。

这三台IP地址依次分别如下

192.168.95.2

192.168.95.3

192.168.95.129

连接一台受控主机,以K的方式验证,如不使用 -k 功能,则不能连接

同时连接两台受控机,在IP地址后面再添加一条即可,用逗号隔开

我们发现,无论是连接一台或者多台,都要输入受控机的密码,这样做是不是很麻烦呢? 到这里就有人想到用openssl 做一个 基于key 的免密认证 ,下次登录的时候就不用再输入密码了,真的是很聪明呢!

[root@centos7 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.95.3

[root@centos7 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.95.129

若感觉SSH连接太慢,则更改/etc/ssh/sshd_conf 文件 

 ansible系列命令

ansible-doc: 显示模块帮助,相当于man

-a 显示所有模块的文档


-l, --list 列出可用模块


-s, --snippet 显示指定模块的playbook片段

示例:
ansible-doc –l 列出所有模块


ansible-doc ping 查看指定模块帮助用法


ansible-doc –s ping 查看指定模块帮助用法

ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args]
--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写—list
-k, --ask-pass 提示连接密码,默认Key验证
-K, --ask-become-pass 提示输入sudo
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的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 “~(web|db).*.magedu.com” –m ping

 ansible 执行过程

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退出


执行状态:

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

示例
以wang用户执行ping存活检测
ansible all -m ping -u wang -k


以wang sudo至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

 ansible常用模块

 command :在远程主机执行命令,默认模块,可忽略-m 选项

例:ansible  all  -a  'df  -h'   查看所有主机的分区利用率

       ansible all -a 'removes=/etc/fstab cat /etc/fstab'    查看所有主机的/etc/fstab ,如果存在,则执行,不存在则跳过不执行

         ansible all -a 'removes=/etc/fstab cat /etc/fstab'    与removes相反,如果存在则不执行,不存在则执行

       ansible all -a  'chdir=/boot  ls'                                切换到boot文件夹  用 ls 查看

  shell 模块  : 用shell 执行命令

 例:ansible all -m  shell  -a  'echo $HOSTNAME'

          ansible  all  -m  shell  -a 

          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/SCRITP_FILE"

ansible  all/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 ’ dest=/tmp/f1.txt” 利用内容,直接生成目标文件

例:将本机文件复制到远程主机 , 如果想删除要用   shell 模块  (-m   shell)

 

 复制文件 修改权限 和 所有者

 fetch模块

从客户端取文件至服务器端,copy相反,目录可以先tar

ansible  all -m   etch  -a  'src=/root/a.sh  dest=/date/scripts'

 示例: 打包/var/log 下所有日志 文件并远程抓取

ansible all  -m  shell  -a 'tar Jcf  log.tar.xz  /var/log/*.log'

ansible all  -m  fetch  -a  'src=/root/log.tar.xz  dest=/date'

file 模块

设置文件属性

ansible  all  -m  file  -a 'name=/date/f3  state=touch'     创建文件

ansible  all  -m  file  -a  'name=/date/f3 state=absent'    删除文件

ansible  all  -m  file  -a  'name=/date/dir1 state=directory'   创建目录

ansible  all  -m  file  -a  'name=/date/dir1 state=absent'       删除目录

ansielb  all  -m  file  -a 'src=/etc/fstab  dest  /data/fstab.link  state=link'    创建软链接

ansible  all  -m file  -a  'dest /data/fstab.link  state=absent'     删除软链接

ansible  all  -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"

 注意:

(1)host 模块不会修改/etc/hosts 文件中的主机名解析, 注意修改

(2)批量修改主机名是最好加变量,放置素有主机名一致

cron 模块

计划任务

支持时间: minute . hour , day, mouth, weekday

ansible all  -m   cron  -a "minute=*/5  job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' 

name=synctime" 创建任务

ansible  all  -m  cron  -a 'state=absent anme=synctime'  删除任务

示例:

创建计划任务:每周1、3、5 每分钟打印 ,任务名称:warningcron

ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall  warning " name=warningcron'

 

注释cronname=waringcron 的计划任务

ansible  all  -m  cron  -a  'disabled=true  job="/usr/bin/wall warning" name=warningcron'

给cronname=waringcron的计划任务去掉注释:

ansible all  -m cron  -a 'disabled=true  job="/usr/bin/wall warning" name=warning '

创建计划任务:每5分钟同步一次服务器时间, 任务名称:sync

ansible  all  -m  cron  -a  "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null'

name=sync"

删除计划任务

ansible  all  -m  cron  -a 'state=obsent name=sync'

yum模块

管理包

示例:

yum安装vsftpd包:(默认 state=install)

ansible all -m  yum  -a 'name=vsftpd'

安装多个包用逗号隔开

ansible all -m  yum  -a 'name=vsftpd,httpd'

显示所有已安装的包

ansible  all  -m  yum  -a 'name=vsftpd  list=install'

卸载vsftpd包

ansible  all  -m  yum  -a 'name=vsftpd  state=removed'

安装从互联网下载的包

ansible  srv(主机清单分组)  -m copy  -a  'src=/root/package.rpm dest=/data/package'

ansible  srv  -m  yum  -a 'name=/data/package.rpm'

更新缓存

ansible  all  -m  yum  -a  'update_cache=yes'

更新缓存同时安装dsta包

ansible  all  -m  yum  -a 'name=dstat  update_cache=yes'

ansible  all  -m  yum -a 'name=httpd  state=latest'  安装

ansible  all  -m  yum  -a  'name=httpd  state=absent'  删除

 

service模块

管理服务

ansible  all  -m  service  -a  'name=httpd state=stopped'  停止服务

ansbile  all  -m  service  -a  'name=httpd state=started'    开启服务(reloaded:重载  restarted:重启)

 

user 模块

管理用户

添加用户、指定uid、家目录、主组及注释

ansible  all -m  service   -a 'name=user1  comment="test  user" uid=2048 home=/app/user1 group=root'

ansible  all -m  user  -a  'name=sysuser1 system=yes home=/app/sysuser1'

ansible  all -m user   -a  'name=user1  state=absent  remove=yes'  删除用户及家目录等数据

 

添加一个nginx用户:

ansible srv -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment=”nginx service”

删除nginx用户同时删除家目录:

ansible srv -m user -a ‘name=nginx state=absent remove=yes’

group模块

          管理组

创建一个系统组

ansible  all  -m group  -a  "name=testgroup  system=yes"

删除一个组

ansible  all  -m  group -a "name=group11  state=absent"

创建nginx组

ansible  all  -m  group  -a  'name-nginx  system=yes  gid=80'

删除nginx组

ansible  all  -m  group  -a  'name=nginx  state=absent'

ansible系列命令

ansible系列命令包括

ansible

ansible-doc

ansible-playbook

ansible-vault

ansible-console

ansible-galaxy

ansible-pull

ansible-doc

功能 显示模块帮助,相当于man

格式:ansible-doc [options]  [module...]

-a        显示所有模块文档

-l         列出可用模块

-s        显示制动模块的 简洁用法

示例:

ansible-doc  ping        查看ping模块帮助

ansible-co  -s ping      查看ping模块的简单说明

ansible-vault

功能:管理加密解密yml文件

格式:ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml   加密yml文件

ansible-vault decrypt hello.yml   解密yum文件

ansible-vault  view  hello.yml      查看yml加密文件

ansible-vault edit hello.yml         编辑加密文件

ansible-vault rekey  hello.yml     重新修改加密口令

ansible-vault  create  new.yml    创建新文件

ansible-console

功能:ansible控制台,可交互执行命令,支持tab

root@test(2)[f:10] $

执行用户@当前操作的主机组(当前组的主机数量)[f:并发数] $

设置并发数:forks  n     例:    forks  10

切换组:cd主机组         例:    cd  web

列出当前组朱姐列表:list

列出所有的内置命令:?或 help

 示例

 列出主机列表中所有主机

root@all (2)[f:5]$ list

切换至appsrvs组

root@all (2)[f:5]$ cd appsrvs

列出appsrvs组下所有主机

root@appsrvs (2)[f:5]$ list

 例:

 安装httpd服务

root@appsrvs (2)[f:5]$ yum name=httpd   state=present

开启httpd服务:

root@appsrvs (2)[f:5]$  service name=httpd state=stated

 ansible-galaxy

 功能:连接 https://galaxy.ansible.com下载相应的roles

列出所有已安装的galaxy:

ansible-galaxy list

安装galaxy:

ansible-galaxy install geerlingguy.redis

删除galaxy:

ansible-galaxy remove geerlingguy.redis

 ansbile-pull

功能:推送命令至远程,效率无限提升,对运维技术要求较高

当前应用还较少

在本节内容中,我们主要介绍了ansible的使用及一些常用模块,在下节内容中,我们将为您解读

ansible中playbook以及roles的使用

  

原文地址:https://www.cnblogs.com/huxiaojun/p/9108218.html