在管理机器上安装ansible工具

yum  install ansible

将需要管理的主机加入absible,的主机管理清单配置文件/etc/ansible/hosts

格式:inventory文件遵循INI文件风格,中括号中的字符为组名。 可以将同一个主机同时归并到多个不同的组中;此外,当如若 目标主机使用了非默认的SSH端口,还可以在主机名称之后 使用冒号加端口号来标明

1)不分组方式 #不推荐这样使用

192.168.136.5:2222  #冒号后面的2222表示端口号

192.168.136.6

2)分组方式

[web]   # web表示组名,分组以后可以直接通过组名来进行管理组里面的主机

192.168.136.5

192.168.136.6

[opt]

192.168.136.[7:10]   #这表示范围,从192.168.136.7到192.168.136.10之间的所有主机

[webservers]

www1.magedu.com

www2.magedu.com

ansible管理主机一般最好是先基于key验证之后管理起来会比较方便

步骤:

1)生成公私钥对

ssh-keygen

2)将公钥复制到所有主机

可以编写脚本:完成这一步

也可以用ssh-copy-id  <主机ip>即可


ansible 配置文件

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

[defaults]

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

#library  = /usr/share/my_modules/ # 库文件存放目录

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

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

#forks          = 5   # 默认并发数

#sudo_user      = root  # 默认sudo 用户

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

#ask_pass      = True

#remote_port    = 22

#host_key_checking = False  # 检查对应服务器的host_key,建议取消 注释

#log_path = /var/log/ansible.log   #会把你执行的命令生成日志计入在/var/log/ansible.log文件中,建议把这一项启用起来,


ansible

功能介绍

基于模块化,远程管理主机,并且是基于ssh方式连接主机的方式,安全性高

格式

[-m module_name] [-a args]

特点

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格式,编排任务,支持丰富的数据结构

12)较强大的多层解决方案

ansable系列命令

ansible    

ansible-doc  

ansible-playbook    

ansible-vault    

ansible-console  

ansible-galaxy  

ansible-pull

ansible-doc 查看模

块帮助用法

ansible-doc –l  列出所有模块

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

ansible-doc –s  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退出

执行状态:

绿色:执行成功并且不需要做改变的操作

×××:执行成功并且对目标主机做变更

红色:执行失败

选项

说明

--version

显示版本

-m module

指定模块,默认为command

-v

详细过程 –vv  -vvv更详细

--list-hosts

显示主机列表,可简写—list

--ask-pass

提示连接密码,默认Key验证

-C,   --check

检查,并不执行

-T  --timeout=TIMEOUT

执行命令的超时时间,默认10s

-u   --user=REMOTE_USER

执行远程执行的用户

-b --become

代替旧版的sudo 切换

模块介绍

模块名成

功能介绍及常用参数

ping

一个简单的测试模块,这个模块总是在成功的接触中返回“乒乓”。这是不合理的

但是它对于验证登录的能力和可用的python来说是有用的。

配置。这不是ICMP ping,这只是一个简单的测试模块。对于Windows目标,使用

(win_ping)模块。

用法: anisble   主机    -m    ping

command

命令的模块接受命令名,后面是空格分隔的参数列表。给定的

命令将在所有选定的节点上执行。它不会通过shell进行处理,所以变量

“$ HOME”和操作,比如“<“”、“”>“”,“”|“”、“”;“和”不会起作用(使用shell模块

如果您需要这些特性)。

常见选项:

1),chdir  <切换目录>   格式: ansible  主机组   -m command -a  ‘chdir=/app/   ls  -al   /app ’

2),creates <判断如果文件不存在就执行后面的命令>  格式:  ansible  主机组   -m command -a  ‘creates=/etc/fstab   ls -al /app’

3),removes <判断如果文件存在就执行后面的命令>  格式: ansible  主机组   -m  command -a  'removes=/etc/fstab  ls-al  /app/'

shell

shell的模块接受命令名,后面是空格分隔的参数列表。这几乎是

与命令模块完全一样,但是在远程节点上通过shell(/bin/sh')运行命令

支持 特殊符号$ HOME”和操作,比如“<“”、“”>“”,“”|“”、“”;“

在执行命令是尽量使用单引号,

其他用法基本跟command模块相同

script

脚本的模块接受脚本名称,发送到远程主机上执行,

格式:ansible 主机组   -m  script   -a   ‘/app/f1 .sh ’

copy

copy'模块将一个文件从本地或远程机器复制到远程机器上的一个位置。使用com

fetch模块将文件从远程位置复制到本地框。如果你需要变量插值

在复制的文件中,使用模板模块。

注意:copy模块复制文件如果目录不存在会自动创建目录

常用参数:

content:<把自定义内容复制到远程主机文件中>  格式 : content=“df -h \nls\n\hostname   dest=/app/f1.sh”

src:<本机源文件>

dest:<指定复制到目标主机的某个目录或者覆盖某个文件>  

backup:<文件复制到远程主机如果文件已存在可以将源文件做备份,再覆盖>  格式: backup=yes /no  yes表示做备份,no表示不做备份

directory_mode :<复制整个目录>

mode:<更改复制过去的文件权限>    格式: mode=644......

owner:<更改复制过去的文件属主>   格式:owner=wang

格式:ansible 主机组   -m copy -a  ‘src=/etc/fstab dest=/app/  backup=yes mode=644 owner=wang’

fetch

这个模块的工作方式类似于复制,但反过来。它用于从远程机器获取文件

将它们存储在本地目录下

常用参数:

src:<指定远程主机的文件>

dest:<指定本地主机的目录>

格式:ansible  主机组  -m fetch -a  ‘src=/etc/fstab  best=/app/’

file

支持在被控主机创建空文件,创建软连接,删除文件等作

常用选项:

创建空文件:path=<指定创建文件路径>   一般配合state=touch使用

创建软连接:src=<指定原始文件路径>  一般配合path=<创建到那个目录>,state=link<连接>

创建目录:path=<指定路径>    一般配合state=directory使用

删除文件:  path=<指定文件路径>  一般配合state=absent使用

设置文件权限:mode<设置文件权限>     owner<设置文件属组>

格式:

创建文件

ansible  主机组 -m file -a ‘path=/app/testfile state=touch’

创建软连接

absible 主机组  -m file -a ‘src=/app/testfile path=/tmp/testfile-link  stare=link’

创建目录

absible 主机住  -m file -a 'path=/app/dir1  state=directory'

删除文件

ansible 主机组 -m file -a ‘path=/app/testfile state=absent’e

hostname

更改被控主机端的主机名

格式:

ansible 主机   -m hostname -a 'name=名字'

cron

创建计划任务

minute<分钟>

day <天>

hour<小时>

weekday<周>

month<月>

job<执行的操作> 注意:命令需要写全路径

name<计划任务的名字>

disabled=yes

start=absent <表示删除计划任务>

例子:

ansible 主机组  -m cron -a 'minute=*/5 hour=12  weekday=0,6  job="/usr/sbin/wall  is jobs " name="test job"'

此命令原理:  创建一个名为test job计划任务 每周六周天,凌晨12点没5分钟执行一次wall广播 is job

禁用,启用计划任务

ansible 主机组  -m cron -a 'disabled=yes/on job="执行的操作"  name="计划任务名字"'

删除计划任务

ansible  主机组  -m cron -a 'start=adsent  job="执行的操作" name="计划任务名字"'

yum

管理软件包模块

安装软件包

name=包名

start=absent  卸载包

start=latest   装最新版

updata_cache=yes  更新yum缓存

service

管理服务状态模块

常用选项

name=<指定包名>

state=<指定运行状态>   如:stopped<停止>,started<启动>,restarted<重启服务>, reloaded<重读配置文件> ,

enabled=yes  表示把服务设置为开机自动重启

格式:

设置服务开机自动启动并且启动

ansible 主机组  -m  service -a  'name=httpd state=started  enabled=yes'

user

创建管理用户

常用选项:

name=<指定用户名>

comment=<描述信息>

uid=<指定uid>

home=<指定家目录路径>

group=<指定 主组>

groups=<指定辅助组>

system=yes

shell=<指定shell类型>

remove=yes

例子:

创建普通用户

ansible 主机组  -m user -a 'name="test" uid=2000 home=/app/test  group=wang groups=root,bin '

创建系统用户   <注意:默认创建系统用户会创建家目录>

ansible 主机组  -m user -a 'name=sys  system=yes  shell=nologin'

删除用户并把家目录删除

ansible 主机组  -m user -a 'name="test"  state=absent remove=yes’

group

管理组

name=<指定组名>

state=<指定操作>

例子

创建组

ansible 主机组  -m group -a 'name=group1  '

删除组

ansible 主机组 -m group -a 'name=group1 state=absent'

setup

显示所有被控主机的,所有主机信息,例如:IP,主机名,版本,等等信息

常用选项

filter="*信息*"<作用用来匹配想要查看的信息>

例子:

ansible 主机组 -m setup  -a 'filter="*hostname*"'   注意匹配时需要把匹配的值放在双星*号里面

匹配主机列表的方式:

All :表示所有Inventory中的所有主机  

ansible all –m ping

*  :通配符  

ansible  “*”  -m ping    #匹配所有主机执行ping模块操作

ansible  192.168.1.* -m ping  #匹配192.168.1.这个网段的所有主机,执行平模块操作

ansible  “*srvs”  -m ping  #匹配主机组名后面srvs的主机组执行ping模块操作

或关系:  

ansible “websrvs:appsrvs”  -m ping  #这表示匹配两个主机组里面的所有主机

  ansible  “192.168.1.10:192.168.1.20”  -m ping   #这是只针对两台主机执行ping模块操作

逻辑与

ansible “websrvs:&dbsrvs” –m ping   在websrvs组并且在dbsrvs组中的主机,才执行ping模块操作

逻辑非

ansible 'websrvs:!dbsrvs' –m ping   #在websrvs组,但不在dbsrvs组中的主机 ,执行平模块中操作

综合逻辑

ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping  #匹配在websrvszu或者在dbsrvs组,并且在appsrvs组,但不在ftpsrvszu里的主机,才会执行ping模块操作

正则表达式

ansible “~(web|db).*\.magedu\.com” –m ping  #匹配以带有web关键字后面跟任意字符.magedu.com的主机组,或者带有db关键字后面跟任意字符.magedu.com的主机组,执行ping模块操作


ansible系列命令

Ansible-vault

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

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

ansible-vault encrypt hello.yml 加密

ansible-vault decrypt hello.yml 解密

ansible-vault view hello.yml 查看

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

ansible-vault rekey  hello.yml 修改口令

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


Ansible-console:2.0+新增,可交互执行命令,支持tab

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

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

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

列出当前组主机列表: list

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

示例:

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

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

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

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

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


常用选项示例:

查看主机组名里包括多少台主机

anisble  主机分组名   --list-host

如图: