一般企业应用场景
Dev开发环境---测试环境---发布环境---生产环境
灰度环境(全量发布前先面向精准少量用户发布,可基于用户或者主机)
常用自动化工具
Ansible Agentless 中小型应用环境 ansible,saltstack用python编写
Saltstack 一般需要部署agent,执行效率高
Puppet 功能强大,配置复杂
ansible的特性
模式化(Paramiko,PyYAML,Jinja2三个关键模板),支持自定义模块,基于python语言,安全基于OpenSSH,幂等性
/etc/ansbile/ansible.cfg -----主配置文件
[defaults]
#inventroy= 主机文件清单
#library= 库文件
#module_utils = 模块路径
#remote_tmp = 远程临时目录
#local_tmp = 本地临时命令执行目录
#forks = 并行执行的操作数
#sudo_user = root 以什么身份远程执行命令
#remote_port = 远程主机端口
#ask_sudo_pass = True 执行命令是否询问ssh密码
#host_key_cheeking = False 检查对应服务器的host_key(建议取消注释)
#log_path = 日志文件路径(建议开启)
ansible免密登陆其它主机
ssh-keygen -t rsa ----------生成密钥
修改/etc/ansible/ansible.cfg------------->host_key_checking = False
修改/etc/ansible/hosts ------->ansible_ssh_user=root ,ansible_ssh_pass=密码 ,ansible_ssh_port=22
ansible cli1 -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}'" -----分发密钥
ansible all -m ping -----检查是否成功
ansible获得root的授权执行命令
/etc/sudorers
%wheel ALL=(ALL) ALL sudo授权组
%wheel ALL=(ALL) NOPASSWD:ALL 此为不用sudo验证。开启后ansible不用选项-K输入sudo口令
usermod -aG wheel 用户 ----将用户加入授权组
或者创建用户时useradd -G wheel 用户
命令
ansible <host-pattern> [-m 模块] [-a 参数] <host-pattern> /etc/ansible/hosts主机列表名
ansible all -m ping
all ---匹配所有列表 还可以这样匹配 "*","192.168.1.*" "组1:组2" "IP1:IP2" ' 组1:!组2' 在组1而不在组2
[-m 模块]
常用模块
command:默认模块(可不用-m),不支持¥VARNAME、<、>等符号
shell:调用bash命令
script:运行脚本 ansible all -m script -a " "
copy:拷贝模块,从服务端拷贝至客户端 ansible all -m copy -a 'src= dest= backup=yes'
fetch:从客户端拷贝文件至服务端 ansible all -m fetch -a ''src= dest= "
若要拷贝大量文件,可以将其打包再拿取
file:文件模块 ansible all -m file -a 'path/name/dest= state=directory(目录)、absent(删除)、touch'
创建链接: ansible all -m file -a 'src= path= state=link/hard'
hostname:管理主机名 ansible all -m hostname -a 'name= '
cron:计划任务 ansible all -m cron -a 'minute= job= name= '
ansible all -m cron -a 'disabled=true/false /yes /on job= name= state=absent '
yum:包管理工具 ansible all -m yum -a 'name= state=latest/absent disable-gpg-check=yes(不用钥匙验证)'
server:服务管理 ansible all -m server -a 'name= state=stoppde/restarted enabled=yes'
user:管理用户 ansible all -m user -a 'name= shell= uid= system=yes(是否为系统用户) home/groups(附加组)= ' remove=yes state=abset'
group:管理组
ansible-doc ------------ > 显示模块帮助 ansible --version 查看版本
-a 所有模块 -v 查看详细信息 -vv -vvv
-l 可用模块显示 --list 列出主机列表
-s 显示模块playbook片段 -k 输入ssh连接密码,默认key验证
ansible-galaxy -K 输入sudo口令
http://galaxy.ansible.com -u user 远程执行的身份
list 列出所有装载的galaxy
install / remove 安装/删除 ansible-pull 推送命令至远程主机
ansible-vault 管理加密解密yml文件 ansible-console 控制台管理
encrypt/decrypt file 加密/解密 root@all(3)[f:5]$--->远程角色:针对主机:主机列表数:最大并行数
view/edit 查看/编辑
rekey/create 修改口令/创建文件
ansible-playbook 文件(以.yaml/.yml为后缀名)
vim jin.yml 缩进统一,tab和空格只能使用其中一种 --check 检测文件 -C
--- --list-hosts 列出运行任务主机
- hosts: all 针对所有主机 --limit 主机列表 针对不同主机列表操作
remote_user: root 远程执行身份 --list-tags 列出文件中标签
tasks: 如果命令或脚本推出码不为0,则在模块下行加ignore_errors:True
- name: 描述 (或加shell:命令 | | /bin/true)
yum: (模块)
file:name= state=touch
copy: src= dest= backup=yes
service: name= state= enabled=yes
notify: jin
tags: yan 标签,指定关键字作为标签,可单独执行该部分命令,ansible-playbook -t yan file ,标签相同则一起执行
handles: handles和notify结合使用调用出发点,将notify加入指定name下,添加handles表明notify指定部分若发生变化,则会出发执行handles中的模块命令
- name: jin
service: xxx
playbook中的变量使用
1.ansible all -m setup 显示相关主机的环境变量 (-a 'filter=变量名')
2./etc/ansible/hosts 中定义
普通变量:主机组中主机单独定义 普通变量优先级高于公共变量
公共变量:针对所有主机
3.命令指定变量,优先级最高 ansible-playbook -e 'varname=value'
4.playbook中定义
- hosts:
vars:
- 变量名:变量
vars_files:
- xx.yml
5.role中定义
template模块 ,根据目的机生成相适应的配置文件,模板位置随意,最好与playbook同级,存于templates目录中(.j2为后缀)
palybook中应用 --name:
template: scr= dest=
when语句的使用
- name:
yum: name=
when: ansible_distribution_major_version == "7" 系统版本为7
解决重复操作(迭代)
- name:
file: name= /xx/{{ item }}
with_items:
- file
迭代嵌套子变量
- name:
user: name={{ item.name }} group=={{ item.name }}
with_items:
- {name:xxx ,group:xxx}
for循环语句
--- /templates/nginx.conf.j2
- host: {% for port in ports %}
remote_user server { listen {{ port.value }}
vars: }
ports: {% endfor %}
- value : xxx
tasks:
for循环加if条件判断 templates/nginx.conf.j2
xxx.yml {% for vhost in nginx_vhosts %}
- hosts: server{
remote_user: listen {{ vhost.listen }}
vars: {% if vhost.server_name is defined %}
nginx_vhosts: server_name {{ vhostserver_name}}
- web1: {% endif %}
listen:8080 root {{ vhost.root }}
root: "/var/www/nginx/web1“ }
- web2: {% endif %}
listen:8080 生成内容
server_name: yi.yan.com server{
root: "/var/www/nginx/web2“ listen 8080 root /var/www/nginx/web1
}
tasks: server{
- name: listen 8080
template: src= dest= server_name: yi.yan.com root: /var/www/nginx/web2 }
role的复杂场景使用(将playbook中的各个部分分别放在不同的目录,方便调用。)
在roles目录下创建需求对应文件夹 mkdir roles/{xx,xx,xx} -pv 剧本playbook文件与roles目录平级
例子:安装nginx (group:nginx user:nginx yum:nginx service)
/etc/ansible/roles创建nginx目录 cd /etc/ansible/roles/nginx vim group.yml user.yml yum.yml service.yml template.yml
并且创建汇总文件,指定文件执行顺序 vim main.yml - include: group.yml .....
于roles同级创建playbook调用
vim use_nginx.yml
- hosts:
remote_user:
roles:
- role: