一、ansible简介
ansible基于python开发的自动化运维工具,其功能实现基于ssh远程连接服务
ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能
http://www.ansible.com/ ##帮助手册
1.1 一些常用的自动化运维工具
Puppet —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱
SaltStack —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YMAL,使得配置 脚本更简单。
1.2 Ansible —基于 Pythonparamiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2 模板语言,
更强的远程 命令执行操作 ,Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、
编排 task(持续 交 付、无宕机更新等),采用paramiko 协议库(fabric 也使用这个),通过 SSH 或者 ZeroMQ 等连接主机。
1.3 Ansible 工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执 行,执行完之后自动删除,
可以使用SVN 等来管理自定义模块及编排
1.4 Ansible 的组成由 5 个部分组成:
①,Ansible:核心引擎(包含2个模块)
核心模块:ansible模块资源分发到远程节点使其执行特定任务或匹配一个特定的状态。
自定义模块:如果核心模块不足以完成某种功能,可以添加自定义模块。
②,Plugins:完成模块功能的补充,包括连接插件、邮件插件等
③,Playbooks:定义ansible任务的配置文件,可以将多个任务定义在一个剧本中,
④,由ansible自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理。
⑤,Inventory:定义 Ansible 管理主机的清单
二、特点:
1、不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端
2、不需要服务端
3、需要依靠大量的模块实现批量管理
4、配置文件/etc/ansible/ansible.cfg
三、准备环境:
ssh key+ansible (ansible需要先ssh认证)
1、管理机 需要配置好ssh密钥认证
2、管理机 连接到客户端1、客户端2...不需要密码
3、关闭防火墙
四、安装服务
yum -y install epel-release ##安装epel源
yum -y install ansible
五、ansible配置文件
[root@test1 ~]# tree -F /etc/ansible/
/etc/ansible/
├── ansible.cfg ##目前不需要修改,如果所有服务器的ssh端口变了就修改
├── hosts ##被ansible管理的服务器IP地址列表(也可以是主机名但是主机名必须被解析)
└── roles/ ##目录下是空的
配置文件详解:
[defaults] #通用默认配置段
#inventory = /etc/ansible/hosts #被控端IP或者DNS列表
#library = /usr/share/my_modules/ #ansible默认搜寻模块位置
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp #ansible远程执行临时文件;
#local_tmp = ~/.ansible/tmp
#forks = 5 #并行进程数
#poll_interval = 15 #回频率或者轮训间隔时间
#sudo_user = root #sudo远程执行用户名
#ask_sudo_pass = True #使用sudo,是够需要输入密码
#ask_pass = True #是否需要输入密码
#transport = smart #通信机制
#remote_port = 22 #远程SSH端口
#module_lang = C #模块和系统之间通信语言
#module_set_locale = False
#gathering = implicit #控制默认facts收集(远程系统变量)
roles_path= /etc/ansible/roles 用于playbook搜索Ansible roles;
host_key_checking = False 检查远程主机密钥;
#sudo_exe = sudo sudo远程执行命令;
#sudo_flags = -H 传递sudo之外的参数;
timeout = 10 SSH超时时间;
remote_user = root 远程登陆用户名;
log_path = /var/log/ansible.log 日志文件存放路径;
module_name = command Ansible命令执行默认的模块;
#executable = /bin/sh 执行的Shell环境,用户Shell模块;
#hash_behaviour = replace 特定的优先级覆盖变量;
#jinja2_extensions 允许开启Jinja2拓展模块;
#private_key_file = /path/to/file 私钥文件存储位置;
#display_skipped_hosts = True 显示任何跳过任务的状态;
#system_warnings = True 禁用系统运行ansible潜在问题警告;
#deprecation_warnings = True Playbook输出禁用“不建议使用”警告;
#command_warnings = False command模块Ansible默认发出警告;
#nocolor = 1 输出带上颜色区别,开启/关闭:0/1;
pipelining = False 开启pipe SSH通道优化;
[accelerate] accelerate缓存加速。
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
accelerate_daemon_timeout = 30
accelerate_multi_key = yes
5.1基础配置
编辑ansible的主机配置文件hosts,添加主机组client
cp /etc/ansible/hosts{,.bak}
cat > /etc/ansible/hosts<
[root@test1 ~]# tail /etc/ansible/hosts
[client]
192.168.24.131
192.168.24.132
192.168.24.133
5.2批量运行命令
ansible client -a "uptime"
等于
ansible client -m command -a “uptime”
ansible -vvv -a “hostname”显示执行过程
-m 指定模块
-a 后面执行命令
##注:如果执行管道,-m 指定shell模块
【主要参数如下】
-v,–verbose 打印详细模式;
-i PATH,–inventory=PATH 指定host文件路径;
-f NUM,–forks=NUM 指定fork开启同步进程的个数,默认5;
-m NAME,–module-name=NAME 指定module名称,默认模块command;
-a MODULE_ARGS module模块的参数或者命令;
-k,–ask-pass 输入远程被管理端密码;
–sudo 基于sudo用户执行;
-K,–ask-sudo-pass 提示输入sudo密码与sudo一起使用;
-u USERNAME,–user=USERNAME 指定移动端的执行用户;
-C,–check 测试执行过程,不改变真实内容,相当于预演;
-T TIMEOUT, 执行命令超时时间,默认为10秒;
--version 查看Ansible软件版本信息。
ansible-playbook --syntax-check user.yml #验证yml语法
[root@jenkins script]# ansible-playbook --syntax-check user.yml
[DEPRECATION WARNING]: ACCELERATE_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_DAEMON_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_CONNECT_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_MULTI_KEY option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_PORT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[WARNING]: Could not match supplied host pattern, ignoring: test
playbook: user.yml #正常语法
5.3 批量发送文件
copy 模块
src=从哪里来
dest=到哪里去
mode=修改权限
backup=备份
本地的/root/1.txt 发送到所有的服务器的/opt下
ansible client -m copy -a "src=/root/1.txt dest=/opt/"
##注:src指从哪里来,dest指到哪里去
新文件是黄色的,再次执行是绿色的
ansible client -a "ls -l /opt" ##验证文件是否存在
ansible client -m copy -a "src=/root/1.txt dest=/opt/test/test1/"
##自动在opt下创建/test/test1文件,并将1.txt复制到/test/tes1/目录下
ansible client -m copy -a "src=/root/1.txt dest=/opt/2.txt" ##拷贝且修改文件名
ansible client -m copy -a "src=/root/3.txt dest=/opt/2.txt backup=yes"
##3.txt会覆盖原2.txt,但在此之前会备份2.txt
ansible client -m copy -a "src=/root/4.txt dest=/opt/5.txt owner=test group=test mode=0755"
##修改所有者和文件权限
shell 模块
运行脚本、命令、特殊符号
创建文件
echo 'yum -y install lrzsz' >/opt/yum.sh
1.先把脚本发送到对应的服务器
ansible client -m copy -a "src=/opt/yum.sh dest=/opt/ mode=755"
ansible client -a "ls -l /opt/yum.sh"
2、运行 /bin/sh
ansible client -m shell -a "/bin/sh /opt/yum.sh"
ansible client -m shell -a "rpm -qa| grep lrzsz" ##shell支持特殊符号
script 脚本模块
1.把脚本发送到对应服务器(过程不显示)
2.运行脚本 (过程不显示)
写一个脚本 更改所有服务器的yum源
cat>/opt/yuan.sh<
cron 定时任务模块
每5分钟显示hello到/tmp/test.log
echo '*/5 * * * * echo hello >>/tmp/test.log 2>&1' >>/var/spool/cron/root ##原命令
crond模块
ansible client -m cron -a 'name=hello minute=*/2 job="echo hello >>/tmp/test.log 2>&1"' ##改造后命令
ansible client -a "crontab -l"
例:时间同步
[root@test1 ~]# ansible client -m cron -a 'name=date minute=*/5 job="/usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'
192.168.24.131 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"date"
]
}
[root@test1 ~]# ansible client -a "crontab -l"
192.168.24.131 | CHANGED | rc=0 >>
#Ansible: date
*/5 * * * * /usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1
测试方法:
ansible all -a hostname
ansible -C 操作之前检查语法,模拟一下命令不会生效,无误之后可以去掉-C
##添加定时任务:
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present" -C
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present"
ansible -a "crontab -l"
##删除这个定时任务
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent" -C
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent"
ansible -a "crontab -l"
1.真正运行ansible生效前 检查语法
ansible -C
2.没问题就去掉-C
yum 模块:
ansible client -m yum -a "name=vim state=installed"
ansible client -m yum -a "name=lrzsz,net-tool" ##yum安装多个软件
file模块:
ansible client -m file -a "dest=/tmp/test/ state=directory" ##创建远程目录
ansible client -a "tree -F /tmp/"
owner 设置复制传输后的数据属主信息
group 设置复制传输后的数据属组信息
mode 设置文件数据权限信息
dest 要创建的文件或目录命令,以及路径信息
src 指定要创建软连接的文件信息
六、模块:
6.1 ansible如何查询帮助,查询模块的参数
ansible-doc -s copy ##查看copy模块帮助
ansible-doc -l ##显示所有模块
七、通过ansible批量管理服务
1、命令行 各种模块
2、书写剧本-playbook
ansible部署rsync,nfs,sersync(实践)
八、基础补充--ansible-playbook
8.1特点:
1.配置管理
2.批量部署
3.ad-hoc 批量执行命令
ansible client -m command -a "hostname"
4.编写playbook剧本-脚本
8.2核心功能:
1.pyYAML-剧本语言
2.paramiko-远程连接与数据传输
3.jinjia2--ansible模板
8.3准备环境:
1.四台机器web01 backup nfs01 m01
2.配置好m01与web01 backup nfs的ssh密钥认证
3.配置好m01通过ansible管理web01 backup nfs01
8.4写法步骤:
核心:找谁干啥
ansible语言是yml,严格要求对齐,注意空格
-host:all ##哪台服务器
task: ##做什么任务,运行什么模块
- command:ifconfig
等于
ansible -m command -a "ifconfig"
ansible -m shell -a "echo hello >>/tmp/hello.log"
vim /op/show.yml
---
- hosts: all
tasks:
- command: ifconfig
ansible-playbook /op/show.yml -C 运行
[root@test1 ~]# cat /opt/show.yml
---
- hosts: client ##-空格
tasks: ##两个空格
- command: uptime ##四个空格-空格
---
- hosts: client
tasks:
- shell: ifconfig >/tmp/new.txt
---
- hosts: client
tasks:
- name: "show is addr"
shell: ifconfig >/tmp/new.txt
给所有服务器添加定时任务--变为剧本
---
- hosts: client
tasks:
- name: network restart
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present
删除定时任务:
---
- hosts: client
tasks:
- name: network restart
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=absent
多个任务:
---
- hosts: client
tasks:
- name: network restart
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present
- name: ipaddr
shell: ifconfig
不同机器运行不同命令:
---
- hosts: 192.168.24.131
tasks:
- name: ipaddr
shell: ifconfig
- hosts: 192.168.24.132
tasks:
- name: network
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present
yum 安装:
---
- hosts: all
tasks:
- name: yum install
yum: name=htop,sl,cowsay
批量修改单个用户:
---
- hosts: client
gather_facts: false
tasks:
- name: Change password
user: name={{ name1 }} password={{ chpass | password_hash('sha512') }} update_password=always
ansible-playbook play1.yml -e "name1=username chpass=admin#123" #name1是用户名,chpass后面填新密码,把用户和密码传参进去(适合修改单个用户)