目录
ansible 自动化运维工具,也叫机器管理工具。可以实现批量管理成百上千的多台主机,是应用级别的跨主机编排工具。
ansible的特性:
1)无客户端agent的存在,不需要在被控制的节点上安装任何客户端应用。
2)通过ssh协议与被控制节点通信
3)基于模块工作的,可以通过模块实现在被控制节点上执行相应的命令操作
4)很多模块具有幂等性,即可实现多次模块操作的状态如果没有发生改变,则不会重复执行
ansible命令格式
ansible 组名 -m 模块名 -a '模块参数'
查看模块
ansible-doc -l #列出当前ansible的所有模块
ansible-doc -s 模块名 #查看指定模块的信息
ansible的常用模块
command 在远程主机执行linux命令,但不支持管道、重定向等特殊符号,是ansible的默认模块 chdir creates removes
shell 在远程主机执行linux命令,支持管道、重定向等特殊符号 chdir creates removes
cron 在远程主机设置crontab计划任务 minute hour day month weekday job name state=present|absent
user 在远程主机设管理用户账户 name uid group groups shell create_home remove state=present|absent
group 在远程主机设管理组账户 name gid state=present|absent
copy 将ansible主机的文件/目录/内容复制到远程主机 src dest content mode owner group
file 在远程主机管理文件/目录 path mode owner group state=absent|touch|directory|link src(指定软链接的源路径,path指定软链接文件理解)
hostname 在远程主机设置主机名 name
ping 检测与远程主机的连通性
yum|apt 在远程主机使用yum|apt-get管理软件包 name state=present|absent|latest
service|systemd 在远程主机使用systemctl管理服务状态 name state=started|stopped|restarted|reloaded enabled=yes|no|true|false
script 在远程主机执行ansible主机上的shell脚本
mount 在远程主机执行挂载、解挂操作 src path fstype state=mounted|unmounted|absent opts
archive 在远程主机压缩文件/目录 path dest format remove
unarchive 将ansible主机上的或远程主机上的压缩包解压缩到远程主机的指定位置 copy(remote_src) src dest
replace 在远程主机修改通过正则表达式匹配的文件内容 path regexp replace after before backup
setup 收集远程主机的系统信息(facts信息) filter
inventory主机清单管理
主机清单配置文件 /etc/ansible/hosts
格式:
[组名]
主机IP[:ssh端口] #默认是 22 端口
主机名[:ssh端口]
主机IP[0:255] #设置连续的主机列表范围
主机名[a:z] ansible_port= ansible_user= ansible_password= #设置主机变量
[组名:vars] #设置组变量
ansible_port=
ansible_user=
ansible_password=
[大组名:children] #设置嵌套组
组名1
组名2
组名3
playbook剧本
vim XXX.yaml XXX.yml
---
- name: #设置play的名称
hosts: #指定执行此play的远程主机组
remote_user: #指定执行此play的用户
gather_facts: #设置是否收集facts信息 yes|no|true|false
tasks: #指定此play的任务列表
- name: #定义任务的名称
模块名: 模块参数 #定义任务要使用的模块和参数(键值对格式)
- name:
模块名: 模块参数
ignore_errors: true #忽略此任务的失败
- name:
模块名: 模块参数
notify: '任务名' #定义此任务执行结果为changed状态时要触发的handlers任务
- name:
模块名: 模块参数
when: #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务
- name:
模块名: 模块参数={{item}}
with_items: #定义循环列表
- name:
模块名: 模块参数
tags: #定义任务的标签,ansible-playbook --tags="标签" 可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)
- 标签1
- 标签2
....
handlers:
- name: 任务名
模块名: 模块参数
ansible-playbook XXX.yaml -k -K
--syntax-check
--list-task
--list-hosts
--start-at-task="任务名称"
--tags="标签"
tasks任务的模块语法格式:
纵向格式:
模块名:
- 参数1: 值
- 参数2: "{{变量名}}"
....
横向格式:
模块名: 参数1=值 参数2={{变量名}} ....
with_items 和 vars 的语法格式
纵向格式:
- name:
with_items:
- 值1
- 值2
....
模块名: 参数={{item}}
vars:
变量名:
- 值1
- 值2
....
tasks:
- name:
模块名: 参数={{item}}
with_items: "{{变量名}}"
#值为对象类型(键值对字段)时:
with_items:
- key1: 值1
key2: 值2
- key1: 值3
key2: 值4
....
vars:
变量名:
- key1: 值1
key2: 值2
- key1: 值3
key2: 值4
....
横向格式:
#值为纯量类型时:
with_items: [值1, 值2, ....]
vars:
变量名: [值1, 值2, ....]
#值为对象类型(键值对字段)时:
with_items:
- {key1: 值1, key2: 值2}
- {key1: 值3, key2: 值4}
....
template配置模板模块
1)先准备一个 XXX.j2 配置模板文件,在模板文件中使用 {{变量名}} 格式引用主机变量、组变量、facts信息字段变量或vars字段自定义的变量的值
2)编辑 playbook 文件,在文件中的 tasks 任务中定义 template 模块配置(template: src=XXX.j2文件路径 dest=远程主机文件路径)