ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet,cfengfunc,fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的ansible所运行的模块。ansible只是提供了一种框架/主要包括:
①,链接插件connnection plugins:负责和监控端实现通信;
②,host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
③,各种模块核心、command模块、自定义模块;
④,借助于插件完成记录日志邮件等功能;
⑤,playbook:剧本执行多个任务时,非必须可以让节点一次运行多个任务。
①模块化:调用特点模块,完成特定任务
②有paramkio,pyyaml,jinja2(模块语言)三个
关键模块
③支持自定义模块
④基于python语言
⑤支持playbook编排任务
⑥等幂性
⑦无需代理不依赖PKI(无需ssl)
⑧可是使用任何语言编写模块
⑨YAML格式,编排任务
yum install ansible -y
配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色目录
程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于console界面与用户交互的执行工具
ansible “主机清单” -m “模块” -a “模块语法”
src参数:用于指定需要copy的文件]或目录
dest参数:用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数
content参数:当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force参: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup参数: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner参数: 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group参数: 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode参数: 指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r--r--",则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
encrypt 加密
decrypt 解密
view 查看
edit 编辑加密文件
rekey 修改口令
create 创建新文件
name参数:指定程序服务名
state参数:指定对程序采取何种操作
安装present
卸载absent
启动started
停止stopped
重启restarted
重读配置文件reloaded
开机自启enabled=yes
Shell:在远处主机上执行命令,非默认模块,改为默认模块后可忽略-m 选项
ansible all -m shell -a ‘echo magedu |passwd –stdin wang’
注:上句中all表示主机清单里面所有远程主机,下同。
将shell设为默认模块:
vim /etc/ansible.cfg
module_name=shell
Script:在远处主机上运行ansible服务器的脚本
ansible all -m script -a /data/f1.sh
Copy:从主控端复制文件到远程主机
ansible all -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
Fetch:从远程主机提取文件至主控端,与Copy相反
ansible all -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
File:设置文件属性
ansible all -m file -a "path=/root/a.sh owner=wang mode=755“
ansible all -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
Cron:计划任务,支持时间:minute,hour,day,month,weekday
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate
172.16.0.1 &>/dev/null' name=Synctime"
Yum:管理包
ansible all -m yum -a 'name=httpd state=present'
ansible all -m yum -a 'name=httpd state=absent'
Service:管理服务
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=reloaded’
ansible all -m service -a 'name=httpd state=restarted'
User:管理用户
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048
home=/app/user1 group=root‘
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
Group:管理组
ansible srv -m group -a name=testgroup system=yes“
ansible srv -m group -a name=testgroup state=absent"
Vault 管理加密解密yml文件
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
语法要求
①在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
②次行开始正常写Playbook的内容,一般建议写明该playbook的功能
③使用#号注释代码
④缩进必须是统一的,不能空格和tab混用
⑤缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
⑥YAML文件内容是区别大小写的,k/v的值均需大小写敏感
⑦多个k/v可同行写也可换行写,同行使用,分隔v可是个字符串,也可是另一个列表
⑧一个完整的代码块功能需最少元素需包括 name 和 task
⑨一个name只能包括一个task
⑩YAML文件扩展名通常为yml或yaml
示例①
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age 13
gender: Female
示例②:
---
#test httpd role
- hosts: websrvs:appsrvs
roles:
- role: httpd
tags: web
when: ansible_distribution_major_version == "6"
- role: nginx
tags: web2
when: ansible_distribution_major_version == "7"
基础组件:
hosts:用于指定要执行指定任务的主机,须事先定义在主机清单中
可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs 或者,两个组的并集
Websrvs:&dbsrvs 与,两个组的交集
webservers:!phoenix 在websrvs组,但不在dbsrvs组
示例: - hosts: websrvs:dbsrvs
tasks:任务列表
每个task都应该有其name,用于playbook的执行结果输出。
示例:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
常用选项
--check -C 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--list-tags 列出tag
--list-tasks 列出task
--limit 主机列表 只针对主机列表中的主机执行
-v -vv -vvv 显示过程
示例
ansible-playbook file.yml --check 只检测
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs
roles通过分别将变量、文件、任务、模板及处理器至于单独的目录中,并可以便捷的include它们的一种机制。角色一般用于基于主机构建的场景中,但也可以是用于构建守护进程等场景中
各目录作用
/roles/project/:项目名称,以下子目录
files/ :存放由copy或script模块等调用的文件
templates/:template模块查找所需要模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包z
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为
main.yml的文件,其它文件需在此文件中通过include进行包含
default/:设定默认变量时使用此目录中的main.yml文件
创建role
1,创建以roles命名的目录
2,在roles下创建以角色命名的子目录,如httpd,nginx等
3,在角色目录下创建files,handlers,meta,tasks,templates,vars等
4,在playbook文件中,调用个角色
调用角色方法
-hosts: all
remote_user: root
roles:
- mysql
- nginx
示例:远程主机安装httpd服务
tree roles/httpd/
roles/httpd/
├── files
│ ├── httpd6.conf
│ ├── httpd7.conf
│ └── index.html
└── tasks
├── conf.yml
├── data.yml
├── install.yml
├── main.yml
└── service.yml
2 directories, 8 files
cat roles/httpd/tasks/*.yml
- name: conf6
copy: src=files/httpd6.conf dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6"
- name: conf7
copy: src=files/httpd7.conf dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7"
- name: data
copy: src=files/index.html dest=/var/www/html/
- name: install
yum: name=httpd
- include: install.yml
- include: data.yml
- include: conf.yml
- include: service.yml
- name: service
service: name=httpd state=started enabled=yes
cat role-httpd.yml
- hosts: all
roles:
- role: httpd
检查语法是否错误
ansible-playbook role-httpd.yml -C
执行命令
ansible-playbook role-httpd.yml
以上。
共勉!
转载于:https://blog.51cto.com/14234169/2385755