ansible是一款可以控制上百台服务器的自动化运维工具,也就是说我们可以使用ansible在控制端输入需要在被控端执行的命令,被控端即就可以执行该操作,无需我们一台台机器去配置,这样就大大提高了工作效率
目录
9.playbook中template模板对于for if 循环的使用
3.示例:使用roles部署nginx,要求创建用户及组并启动服务
一、软件安装
环境:ansible-server:centos7,client:192.168.60.128
只在服务端安装即可
# wget http://mirrors.aliyun.com/repo/epel-7.repo
# yum install -y ansible
二、ansible配置文件
/etc/ansible/ansible.cfg(一般保持默认)
[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机临时命令执行目录
#forks = 5 #默认并发数(同时执行5个操作,eg五台主机五台的执行)
#poll_interval = 15 #拉数据的时间间隔(单位:s)
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False #检查对应服务的的host_key,建议取消注释(去掉后,无论ssh是否连接过都不报错)
#log_path = /var/log/ansible.log #日志文件,取消注释可记录管理主机的命令记录
三、简化操作
主控端
vim /etc/ansible/ansible.cfg
#host_key_checking = False //注释掉,否则第一次连接客户端会报错,不注释的话需要ssh连接一下客户端
ansible 192.168.60.128 -a 'ls /root' -k // 未简化前,需要加-k,还要输口令
ansible 192.168.60.128 -a 'ls /root' // 简化后
- 客户端设置:# visudo
- 主控端设置:基于KEY验证,免密登录
# ssh-keygen(直接回车,空密钥)
# ssh-copy-id 192.168.60.128
四、简单了解ansible系列命令
-
显示模块帮助(ansible-doc)
ansible-doc -l 列出所有模块
ansible-doc 模块 查看指定模块帮助用法
ansible-doc -S 模块 查看指定模块的playbook片段
-
ansible命令选项及参数
语法:ansible 主机 -m 模块 -a 命令
选项 | 功能 |
--version | 显示版本 |
-m (module) | 指定模块,默认为command模块 |
-v | 执行的详细过程 -vv,-vvv,更详细 |
--list-host (简写:--list) | 显示主机列表(显示所有:ansible all --list) |
-k | 提示输入ssh连接密码。默认key验证 |
-C,--check | 检查有无语法错误不执行 |
-u | 指定远程执行的用户 |
-
ansible的匹配远程主机的清单列表(/etc/ansible/hosts)
通配符(配合ping模块):* | ansible "*" -m ping // 所有 ansible 192.168.1.* -m ping // 符合该网段所有 |
或关系 | ansible "web:db" -m ping //执行web组和db组中的主机(忽略重复的) |
与关系 | ansible "web:&db" -m ping // 执行在web组并且也在db组中的主机 |
逻辑非 | ansible 'web:!db' -m ping // 在web不在db组,只能使用单引号 |
综合逻辑 | ansible 'web:db:&web:!db' -m ping |
正则表达式 | ansible "~(web|db).*" -m ping |
- 执行状态颜色表示
红色:执行失败
绿色:执行成功并且未做改变的操作
黄色:执行成功并且对目标主机做更改
蓝色:跳过不执行
- ansible-playbook
ansible-playbook hello.yml // 执行脚本
- ansible-vault // 管理加密解密yml文件
- ansible-console: 可交互执行命令,支持tab
root@test(2)[f:10] $: 分别表示: 执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$ | |
设置并发数 | fock n,例如:fock 10 |
切换主机组 | cd 主机组, 例如:cd webserver |
列出当前组的主机列表 | list |
列出所有内置命令 | ? |
例如:
五、ansible常见模块
1.ping:
如:ansible all -m ping
2.command:在远程主机执行命令,默认模块。
可忽略-m选项(此模块不支持一些命令等,可用shell模块实现)如:ansible all -a ‘ls /root’
3.shell:同command相似
用shell执行命令,如:ansible all -m shell -a 'echo a > a'
4.script:运行脚本
如:ansible web -m script -a f1.sh // 注意路径
5.copy:从服务器拷贝文件到客户端
选项 | 功能 |
src | 源文件路径(对于目录,若路径使用"/"来结尾,只复制目录下的内容,若未使用"/"来结尾,则包含目录在内全部复制) |
dest | 目标路径 |
backup | 是否在覆盖之前将原文件备份,yes或no |
content | 替代"src",直接设定指定文件的内容 |
directory_mode | 递归的设定目录的权限,默认为系统默认权限 |
force | 默认为yes即覆盖。若目标主机路径包含该文件但内容不同,设置为yes强制覆盖,设置为no则只有当目标主机路径不存在该文件时才复制 |
示例:
ansible all -m copy -a 'src=/data/test1 dest=/tmp/test1 backup=yes mode=411 owner=tom' // 如目标存在,默认覆盖,并备份改文件,修改所属用户
ansible all -m copy -a "content='test content\n' dest=/tmp/file1.txt" // 利用内容,直接生成目标文件
6.fetch:下载文件
从客户端抓取文件至服务器(目录需要压缩),如:ansible all -m fetch -a 'src=/var/log/messages dest=/data'
7.file:设置文件属性(状态,属组,属主,权限)
选项 | 功能 | 参数选项 |
path,name,dest | 定义文件路径 | |
src,dest: | 软连接的源和目标文件路径,应用于state=link | |
recurse | 递归的设置,只对目录有效 | |
state | 文件或目录的状态 | 创建文件或目录:touch,directory,删除:absent,软硬连接:link,hard |
示例:
# ansible all -m file -a 'path=/data/file state=touch' //创建文件,创建目录用directory,删除用absent
# ansible all -m file -a 'src=/etc/fstab path=/data/link1 state=link' // 创建软连接
8.cron:计划任务
minute,hour,day,month,weekday | 分时日月周 |
job | 要执行的任务,默认执行state=present |
name | 任务的描述 |
state | 任务计划的状态,创建:present,删除:absent |
diabled | 任务启用否,不启用:no,false,启用:yes,true |
user | 以哪个用户的身份执行 |
backup | 对远程主机上的原任务计划内容修改之前做备份 |
cron_file | 指定该选项,则用该文件替换远程主机上的cron.d目录下的任务计划 |
# ansible all -m cron -a 'minute=* weekday=5 job="wall haha" name=wode' // 制定任务
# ansible all -m cron -a 'disabled=true job="wall haha" name=wode' // 注释任务
9.yum:管理包
# ansible all -m yum -a 'name=vsftpd' // 默认安装(state=latest),加参数state=absent卸载,安装多个包逗号隔开
ansible all -m yum -a 'name=dstat update_cache=yes' 更新缓存
10.service:管理服务
ansible all -m service -a 'name=httpd state=stopped' // 重载:reload,重启:restart,启动:started,开机自启:enabled=yes
11.user,group:管理用户,管理组
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/data/home/user1 group=root' 创建用户,以及uid,家目录,并描述(comment)
其他选项:shell=/sbin/nologin system=yes //不可登陆的系统用户
ansible all -m group -a "name=testgroup system=yes" // state=absent
五、playbook
playbook就是一个剧本,里面编排好所有任务,在需要的时候执行
1.playbook基础组件
hosts:用于指定要执行指定任务的主机,要事先定义在主机清单中
remote_user: 可用于Host和task中。
tasks:任务列表,一个任务中不能使用相同的模块,如使用则按照最后为准
2.运行playbook的方式
例如:
3.handlers和notify结合使用触发条件
<1>handlers:用于当关注的资源发生变化时,才会采取一定的操作(task发生改变出发handles)
<2>notify:此action可用于在每个play的最后被触发,避免重复操作,仅在所有的变化发生完后一次性执行指定的操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作(监控task,通知handles)
例:
4.tags的使用
在某一任务中写入标签,可以通过标签执行该动作 # ansible-playbook http.yml -t rssrvr
5.playbook中变量的使用
1.变量名:仅能由字母、数字和下划线组成,且只能以字母开头
2.变量来源:
- ansible setup facts 远程主机的所有变量都可以直接调用
ansible all -m setup #查看远程主机的所有变量
ansible all -m setup -a 'filter=ansible_hostname' #过滤主机中的变量
查找到的变量可以直接在playbook中调用
- 在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高与公共变量
公共组变量:针对主机组中所有主机定义统一变量
- 通过命令行指定变量,优先级最高(ansible-playbook -e 'pkname=named' app.yml )
ansible-playbook -e 'pkname1=value1 pkname2=value2' app.yml // 对多个变量
- 在playbook中定义
- 使用变量文件
- 在role中定义
5.模板templates
文本文件,嵌套有脚本(使用模板编程语言编写)
功能:根据模块文件动态生成对应的配置文件,templates文件必须存放于templates目录下,且命名为j2结尾
yml文件需和templates目录平级,结构如下:
6.when
条件测试:如果需要根据变量,facts或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式
在task后添加when子句即可使用户条件测试;when语句支持jinji2表达式语法
7.迭代:with_items
迭代:当有需要重复执行的任务时,可以使用迭代机制,对迭代项的引用,固定变量名为“iftem”
要在task中使用with_items给定要迭代的元素列表
列表格式:字符串,字典
8.迭代嵌套子变量
9.playbook中template模板对于for if 循环的使用
例1:# vim a.yml
# vim templates/for1.confl.j2 // ports来自上图的变量
# 查看结果
例二:嵌套
例三:if的调用
六、roles的使用
复杂场景:建议使用roles,代码复用度高,变形的playbook
1.roles目录结构
每个角色,以特定的层级目录结构进行组织
|---|--playbook.yml
-|--roles
project/ tasks/ files/ vars/ defaults/ templates/ handlers/ meta/
2.roles各目录的作用
/roles/project/:项目名称,有以下目录
files | 存放由copy模块或scripts模块等调用的文件 |
templates | 查找所需要模板文件的目录 |
tasks | 定义tasks,roles的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用 |
handlers | 至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用 |
vars | 定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用 |
meta | 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用 |
default | 设定默认变量时使用此目录中的main.yml文件 |
3.示例:使用roles部署nginx,要求创建用户及组并启动服务
步骤描述及命令 | 具体操作 |
创建roles目录进入 | # cd ansible/roles/nginx |
创建nginx需要的目录 | # mkdir tasks templates |
进入tasks目录写yml文件 | # cd tasks |
创建组:cat group.yml | ![]() |
创建用户:cat user.yml | ![]() |
由yum安装:cat install.yml | ![]() |
重启服务:cat restart.yml | ![]() |
调用模块:cat teml.yml | |
执行顺序:cat main.yml | ![]() |
进入templates目录,写入需要修改的配置 # vim nginx.conf.j2 | ![]() |
回到roles平级目录调用roles # vim nginx_roles.yml | ![]() |
运行playbook | ansible-playbook nginx_roles.yml |
4.roles高级用法
<1>调用多个角色
roles:
- role: nginx
- role: httpd
<2>跨角色调用任务
# vim roles/nginx/tasks/main.yml
- include: roles/httpd/tasks/copy_file.yml
<3>依靠标签选择执行某一roles,可以一个标签也可多个标签
指定标签运行脚本 :# ansible-playbook -t http web_roles.yml
<4>增加when语句