Ansible:python,Agentless,中小型应用环境
Saltstack:python,一般需要agent,执行效率高
Puppet:ruby,功能强大配置复杂,重型,适合大环境
#代理,简单理解为客户端也需要安装实现相应服务的软件
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
Ansible:Ansible的核心程序,ansible的底层是python写的
Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
Core Modules(核心模块):Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Connection Plugins:连接插件,Ansible和Host通信使用
#yum install epel-release
#yum install ansible
ansible的配置文件(配置ansible的工作特性)
/etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts---主机列表配置文件
#library = /usr/share/my_modules/---库文件存放目录
#remote_tmp = ~/.ansible/tmp---临时py命令存放远程主机目录
#local_tmp = ~/.ansible/tmp---本机临时命令执行目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5---默认并发数
#sudo_user = root---默认sudo用户
#ask_sudo_pass = True---每次执行hoc命令时是否询问密码
#host_key_checking = False---检查对应服务器的host_key,建议取消注释
#log_path = /var/log/ansible.log---日志文件
#修改配置文件不需要重启
#建议重启日志
主机清单(也支持域名)
/etc/ansible/hosts
[pikachu]
192.168.146.202
192.168.146.203
Ansible配置客服端(免密登录:第一次连接需要密码)
[root@~]ssh-keygen
[root@~]#cd .ssh/
[root@~]scp id_rsa.pub [email protected]:/root/.ssh/authorized_keys
#将公钥传给客户端,拷贝后的文件名固定
#id_rsa.pub公钥
#id_rsa私钥
ansible3种管理模式:hoc命令行,playbooks,roles(功能性依次增强)
ansible [host-pattern] [-m module_name] [-a args]
--version 显示版本
-f forks 启动并发线程数
-m 指定模块,默认command
--list-hosts 显示主机列表,可简写--list
ansible的Host-pattern
all 表示inventory中所有的主机
#ansible all -m ping--ping一下能不能通
逻辑或
逻辑与
逻辑非
支持通配符和正则
ansible命令执行过程
#ansible-doc -l 查看支持模块
#ansible-doc -s MODEL 查看模块用法
ansible-galaxy
连接 https://galaxy.ansible.com下载相应的roles
#ansible-galaxy list 列出已安装的galaxy
#ansible-galaxy install geerlingguy.redis 安装
#ansible-galaxy remove geerlingguy.redis删除
ansible-vault 管理加密解密yml文件
ansible-vault encrypt a.yml 加密
ansible-vault decrypt a.yml 解密
ansible-vault view a.yml 查看
ansible-vault edit a.yml 编辑
ansibel-vault rekey a.yml 修改口令
ansible-vault create new.yml 创建新文件
-chdir 执行命令前,切换所在目录
#ansible all -a 'chdir=/tmp ls'
-creates 逻辑关系,如果后面的文件存在,则不执行后面的操作,反之执行
#ansible all -a 'creates=/etc/fstab cat /etc/fstab'
-removes 不存在,不执行
ansible all -m script -a f.sh
#ansible all -m copy -a 'src=/root/a.sh dest=/root/a mode=000 owner=pikachu backup=yes'
#backup是否备份
#ansible all -m copy -a'content=test dest=/root/a.sh'直接生成文件
archive压缩 unarchive解压
force:需要在两种情况下强制创建软链接
1.源文件不存在但之后会建立的情况下
2.目标软连接已经存在,需要取消之前的软链接,然后创建洗的软连接,有两个选项:yes|no
group:定义文件/目标的属组
mode:定义文件/目录的权限
owenr:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果文件不存在,创建目录
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
file:即使文件不存在,也不会被创建
link:创建软连接
hard:创建硬链接
#ansible all -m file -a ‘src=/etc/fstab dest=/root/fstab.link state=link’ (name path dest是等价的)
#ansible 192.168.146.201 -m hostname -a 'name=pika'
#ansible all -m cron -a 'minute=* weekday=1,3 job=''usr/bin/wall FBI waring" name=warningcron'
#ansible all -m cron -a 'disabled=true job...'禁用计划任务,必须有job和name disabled=false启用或者yes、no
state=absent 删除计划任务
#absible all -m yum -a 'name=httpd,vsftpd state=installled'
#state=present、latest(安装)、absent(卸载),不写state默认安装
#ansible all -m service -a 'name=httpd state=started enabled=yes'
#ansible all -m user -a service -a 'name=nginx shell=sbin/nologin system=yes home=/var/nginx group=root.bin uid=80 comment="nginx server"
#system=yes设置系统用户
#ansible all -m user a 'name=nginx state=absent remove=yes' remove移除家目录
#ansible all -m group -a 'name=nginx system=yes gid=80'
yaml介绍
yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。
yaml又称为剧本,和shell脚本有有些类似,一次性执行你需要执行的命令。
语法介绍
playbook核心元素
1 hosts 执行远程主机列表
2.tasks 任务集
3.templates 模板文件,主要用在复制配置文件
4.tags 标签 指定某条任务执行,用于选择playbook中部分代码
5.handlers 和 notify 触发器,当任务执行时,notify会触发handlers中的相应任务
6.remote_user 执行playbook的用户
注意缩进对齐,‘-’和‘:’后面有空格
playbook中变量的使用
1.playbook中的变量名只能由字母,数字,下划线组成,且只能以字母开头
2.变量来源:
#vim test.yml
#创建yml文件
#ansible-playbook -e 'package=nfs-utils' test.yml
#这时会优先执行‘package=nfs-utils’的变量
192.168.146.203已经安装http,所以不会触发notify,所以changed=0;
192.168.146.202没安装http,所以触发notify,所以changed=2;
这也是幂等性的结果
在模板文件里设置变量 {{ http_port }}
在主机清单里分别设置变量 http_port=
复制过去的文件的变量会自动改变
还可以添加判断条件 when:
#ansible-playbook -t file test.yml
#执行标签(tags)为file的任务
#多个任务可以用同一个标签
#ansible-playbook -C test.yml 提前检测一遍是否存在错误
#ansible-playbook test.yml --list-hosts 查看主机
#ansible-playbook test.yml --list-tasks 查看tasks name
#ansible-playbook teat.yml --list-tags 查看标签
roles就是通过分别将变量、任务、模板等放于单独的目录中,并可以便捷的include它们的一种机制。简单来说,roles就是将任务模块化
建议把roles文件夹放置在/etc/ansible/roles
roles的目录结构如下
将每一个独立的项目分别建一个文件夹,再在httpd下建files、handlers、tasks、templates、vars等目录,而且除了模板和复制文件,
其余文件名称为main.yml。或者每一项任务单独一个yml文件,最后用main.yml去调用其他yml文件。
注意yml文件书写格式还是不变,但是vars里的yml文件要顶格写
如果想执行yml文件,在roles平级目录,创建site.yml文件,roles: 写要调用的任务
#最后
#ansible-playbook site.yml