ansible
ansible 是一个自动化运维工具,他是基于python语言实现,基于openssh安全的工具
特性:
1)幂等性:一个任务执行1遍和执行n遍效果一样 ,不因重复执行带来意外情况
2)无需代理不依赖PKI(无需ssl)
3)可使用任何编程语言写模块
4)YAML格式,编排任务,支持丰富的数据结构
5)较强大的多层解决方案
ansible可以直接由一台服务器连接到其他服务器,由于连接服务器时一般需要输入密码,这比较繁琐,然而ansible是基于ssh的,所以我们通常都会用秘钥的方式来连接ansible主机与其他主机
如果我们首次链接,为了避免挨个先链接所以可以把
/etc/ansible/ansible.cfg
文件中
# uncomment this to disable SSH key host checking
#host_key_checking = False
host那行取消掉注释
常用ansible时,建议吧日志那行启用起来
ansible可以编译安装或者直接yum在epel源中安装
ansible 的配置文件
1) /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
2) /etc/ansible/hosts 主机清单
3) /etc/ansible/roles/ 存放角色的目录
配置文件详解
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 检查对应服务器的host_key,建议取消注释
#log_path=/var/log/ansible.log #日志文件
host:主机清单
可以使用
1)主机名
2)主机IP
3)用[]中括号括起来,中括号内放一个名字,这个名字是组的定义,下方写主机的名字或者IP
4)中括号中支持展开[01:06]代表01到06
程序
1) /usr/bin/ansible 主程序,临时命令执行工具
2)/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
3)/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
3)/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansib le-pull 远程执行命令的工具
4)/usr/bin/ansible-vault 文件加密工具
5)/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
使用方法
ansible-doc -s moudle(模块名):查看模块man文档
ansible-doc moudle 详细模式查看模块用法
-v -vv -vvvv :显示过程
(v越多越详细)
-C :测试ansible执行情况(不执行只测试执行结果)
命令
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-f forks :启动的并发线程数
-m moudle_name :要使用的模块
-a args:模块的参数(-a 参数需要加引号,最好是单引号)
–version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
–list-hosts 显示主机列表,可简写—list
-k, –ask-pass 提示连接密码,默认Key验证
-K, –ask-become-pass 提示输入sudo
-T, –timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, –user=REMOTE_USER 执行远程执行的用户
-b, –become 代替旧版的sudo 切换
host_pattern:
可以跟 1)单个IP
2)多个ip(中间用逗号隔开)
3)主机名
4)组名(定义在/etc/ansible/hosts文件中)
5)all 所有主机
6)a:b :指的是a组或b组中的用户(a:b要用单引号引起来)
7)a:!b
:指的是在a中但是不能再b中(同样引号引起来)
颜色定义
返回值为
绿色:表示执行成功,但对目标主机没有做出任何修改
黄色:表示执行成功,对目标主机做出了修改
蓝色:显示详细过程
红色:表示执行失败
常见的模块:
1)command:给明shell中的命令(此项是默认选项可以省略)
示例:ansible all -a ‘ls’
172.20.113.9 | SUCCESS | rc=0 >>
anaconda-ks.cfg
~None
original-ks.cfg
172.20.113.8 | SUCCESS | rc=0 >>
anaconda-ks.cfg
~None
original-ks.cfg
2)shell 类似于command 但是他可以用管道、变量等
3)cron: 给明生成一个定时任务(在crontab中生成任务 格式与定时任务的格式相同)
示例:
ansible all -m cron -a ‘minute=”*/5″ job=”/bin/echo hello” name=”test corn”‘
其中单引号中整个都是参数
4)user:修改用户属性
示例:ansible all -m user -a ‘name=“user1”’
(在所有主机中创建user1用户)
ansible all -m user -a ‘name=“user1” state=”absent”‘
(删除用户suer1)
5)group:组管理
示例:ansible all -m group -a ‘name=a gid=1 system=yes’
创建组名 a gid为1的系统组
6)copy:文件复制
示例ansible all -m copy ‘src=/etc/fstab dest=/tmp/fstat.txt owner=zhang mode=644’
复制本地/etc/fatab 到主机中的/tmp下改名为fatat.txt 数组是zhang 权限改为644
备注:src指定源文件
dest指定目标文件
(他们必须指定绝对路径)
生成文件也可以不用src 可以用content 指明文件内容
7)file:设置文件的
(修改权限 属主 属组 创建链接等
删除 创建文件、目录等)
示例:ansible all -m file -a ‘path=/tmp/fstab.link src=/tmp/fstab state=link’
给tpm/fstab创建软链接
8)ping:常用于测试ansible状态
测试远程主机的连通性
示例
ansible all -m ping
172.20.113.9 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
172.20.113.8 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
172.20.116.145 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
[root@localhost .ssh]#
9)service:用于管理服务的
ansible all -m service -a ‘enabled=ture name=httpd state=startd’
httpd服务启动,并设为开机启动
常见选项
enabled= (ture或者false)
name= (服务名)
state= (状态 startd stopped restarted)
10)script:把本地的脚本复制到每一台主机中,并执行
11)yum:管理程序包的
(前提是源都配置好)
ansible all -m yum -a ‘name=httpd’
(默认就是安装)
ansible all -m yum -a ‘name=httpd state=absent’
指的是卸载程序包
可以同时安装多个包
包名之间用逗号隔开
如果要更新缓存可以用update_catch=yes作为参数
12)setup:收集远程主机的facts(每个被管理的节点在接受并运行管理命令之前,会将自己主机的相关信息如版本、IP cpu mem等信息传送给ansible主机中)
13)fetch :和copyyige 用法一样,是把远程文件抓取到本机上
playbook:
playbook使用YAML语言
在yaml中
列表中的所有元素使用-打头
多个键值对(映射)组成的叫做字典
我们可以把字典中的项放在花括号中
yaml基础语言元素
变量
inventory
条件测试
迭代
使用方法
ansible-playbook Name.yaml
Ansible-vault:功能,加密playbook
语法:ansible-vault [create|decrypt|edit|encrypt|rekey|view]
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 创建新文件
yaml 格式
通常首行用—三个-来标记档案
次行正常写内容
#代表注释码
缩进必须统一
一个完整的代码块最少需要name:task
playbook的核心元素
hosts:执行的主机列表
tasks:任务集
varniables:内置变量或自定义变量的调用
tags:标签
handlers和notity
templates
用法
—
-hosts:
remote_user:
tasks:
– name:
Moudlename: 要执行的语句
– name:
Moudlename:
要执行的语句
– name:
Moudlename:
要执行的语句
handlers:触发器,和tasts是并列关系
格式
hangdlers:
– name :
moudlename: 语句
– name :
moudlename: 语句
需要出发的项就在tasks中的最下行写
notify: name(handlers的)
如果是多任务,则notify: 换行后Name前面要加-
变量使用
变量命名
变量名仅能由字母、数字和下划线组成,且只能以字母开头
变量定义:key=value
示例:http_port=80
变量调用方式:
通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用“{{ variable_name }}”才生效
1) 在命令中定义变量
ansible-playbook –e 选项指定
ansible-playbook test.yml -e “hosts=centos7”
2)ansibe中自带变量模块
模块是setup
查看方法:ansible all -m setup
可以用自己需要的变量做判断或者引用变量
3)playbook中变量定义
在remote_user下面写
vars:
– var1: Var
– var2: Var2
在下方tasks中用{{}}调用
4)hosts中定义变量
1、在ip后直接定义 var=var
(每个主机可以定义自己的变量,不同的主机的变量可以同名,还可以定义多个变量,)
2、还可以定义给组中的所有成员定义通用变量
格式
[组名:变量名]
var1=var1
var2=var2
变量的生效优先级:
命令行中的变量>host>playbook
host中的变量普通变量优先级高于分组优先级
5) 在playbook文件的同级目录新建file 以.yml结尾
文件中直接写变量var: var
var2: var2
(备注定义变量文件并不需要加-)
playbook的组成
1)host: 由哪些主机组成
2)moudles: 调用哪些模块
3)运行哪些命令
palybooks
1)tasks: 任务
2) var: 变量
3)templates:模板
4)handlers: 触发器
5)roles: 角色
play的主体部分是task list。task list中的各任务按次序逐个 在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
playbook中 条件测试使用when 表示,在要调用的tasks最后写when: 条件
template:
template只能在playbook中调用
template 模板最好放在playbook文件的文件新建一个文件夹,名字叫templates。模板存在其中模板格式为j2。
针对每台主机的不同情况,可以再j2中调用不同的变量
如:hostname中的
setup中的
等等
template 用法和copy一样,他调用变量把文件按照主机不同进行重新定义,发送
这样就做到了根据主机不同配置不同的配置文件
when
跟在某task下when后写条件,指的是,满足条件时才执行task下的任务
playbook中判断相等用 ==
号(两遍有空格)
循环
with_items:循环
示例
—
– hosts: all
remote_user: root
tasks:
– name: create dir
file: path=/data/{{ item }} state=directory
with_items:
– dir1
– dir2
– dir3
迭代嵌套子变量
示例
– hosts:websrvs
remote_user: root
tasks:
– name: add some groups
group: name={{ item }} state=present
with_items:
– group1
– group2
– group3
– name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
– { name: ‘user1’, group: ‘group1’ }
– { name: ‘user2’, group: ‘group2’ }
– { name: ‘user3’, group: ‘group3’ }
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100294