在管理机器上安装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方式连接主机的方式,安全性高 |
格式 | <host-pattern> [-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 <yes表示禁用计划任务,no表示启用计划任务> 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<yes表示创建的是系统用户> shell=<指定shell类型> remove=yes <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
如图: