Ansible基本使用 安装
yum 安装
安装epel源
yum install epel-release -y
安装ansible
yum install ansible -y
列出安装软件包存放的位置
rpm -ql ansible | more
编译安装
Git方式
pip安装
配置文件
/etc/ansible/ansible.cfg 主配置文件 ,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles 存放角色的目录
程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
vi /etc/ansible/hosts
192.168.200.5
192.168.200.5
测试主机连通性
ansible 192.168.200.5 -m ping -k
Ansible命令使用
/etc/ansible/hosts
主机分组
[webservers]
192.168.100.5
192.168.100.6
[dbserver]
192.168.200.4
[appserver]
192.168.200.10[4:5]
ansible webservers -m ping -k
系列命令
ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull
ansible-doc:显示模块帮助
ansible-docoptions
-a 显示所有模块文档
-l,--list 列出可用模块
-s,--snippet 显示指定模块的playbook片段
示例:ansible-doc -l列出所有模块
ansible-doc ping 查看指定模块帮助用法
命令用法
ansible -m moudle_name
--version
-m moudle 指定模块,默认为command
-v 详细过程 -vv -vvv更详细
--list-hosts 显示主机列表,可简写-list
-k,--ask-pass 提示输入ssh连接密码,默认key验证
-K,--ask-become-pass 提示输入sudo时的口令
-C,--check 检查,并不执行
-T,--timeout=TIMEOUT执行命令的超时时间,默认10s
-u, --user=REMODE_USER执行远程执行的用户
-b,--become 代替旧版的sudo切换
ansible all --list-hosts
ssh-keygen
ssh-copy-id 192.168.200.5
ansible命令执行过程
1.加载自己的配置文件 默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.py文件
4.给文件+x执行
5.执行并返回结果
6.删除临时py文件,slepp 0退出
执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
ansible all -a 'chdir=/boot ls'
ansible 192.168.200.5 -m shell -a 'echo $HOSTNAME'
Ansible常用模块详解
Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo magedu | passwd --stdin wang' 不成功
此命令不支持$VARNAME< > | ; 等用shell模块实现
Shell:和command相似,用shell执行命令
ansible srv -m shell -a 'echo magedu | passwd -stdin wang'
调用bash执行命令 类似cat /tmp/stanley.md | awk -F '|' '{print 1,2}' & > /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
Script: 运行脚本
-a "/PATH/TO/SCRIPT_FILE"
snsible websrvs -m scripts -a f1.sh
mkdir ansible
cd ansible/
ls
vi host.sh
hostname
ansible all -m script -a '/root/ansible/host.sh'
Copy
从服务器复制文件到客户端,
ansible server -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner= mode= backup=yes"
如目标存在,默认覆盖,此处指定先备份
ansible server -m copy -a "content='test content\n' dest=/tmp/f1.txt" 利用内容生成目标文件
Fetch:
从客户端取文件至服务器,与copy相反,目录可先tar
ansible server -m fetch -a 'src=/root/a.sh dest=/data/scripts'
src:远程主机的文件目录
dest:主机存放的路径
File:
设置文件属性
ansible server -m file -a "path=/root/a.sh owner=wang mode=755"
ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
ansible all -m file -a 'name=/data/f3 state=touch'
name:名称
state:absent 删除已存在 touch 创建
directory :创建文件夹
link :链接
src:源 dest<=> name<=>path
创建一个软连接
ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'
ansible all -a 'ls -l /etc/selinux/config'
192.168.200.6 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 547 Dec 17 10:46 /etc/selinux/config
192.168.200.5 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 547 Dec 17 10:46 /etc/selinux/config
ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'
ansible all -a 'ls /etc/selinux'
重启
ansible all -m shell -a 'reboot'
Hostname:管理 主机名
ansible node1 -m hostname -a "name=websrc"
Cron: 计划任务
支持时间:minute ,hour ,day,mouth,weekday
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.200.5 & > /dev/null/' name=Synctime"创建任务
ansible srv -m cron -a 'state=absent name=Synctime' 删除任务
YUM:管理包
ansible srv -m yum -a 'name=httpd state=latest/present' 安装
ansible all -m yum -a 'name=httpd,vsftpd'
ansible srv -m yum -a 'name=httpd state=absent' 删除
删除整个目录 (挂载点除外)
ansible all -m file -a 'dest=/data/ state=absent'
ansible all -m copy -a 'src=/data/vsftpd.rpm dest=/root/'
将主机 的rpm包传到其他节点 disablegpgcheck=yes
ansible all -m yum -a 'list=installed' 查看已经安装哪些包
ansible all -m yum -a 'name=vsftpd state=removed' 卸载
ansible all -m yum -a 'update_cache=yes' 更新缓存
Service:管理服务
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=started'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m service -a 'name=httpd state=restarted'
User:管理用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
ansible all -m user -a 'name=user1 state=absent remove=yes'
删除用户及家目录
Group:管理组
ansible all -m group -a "name=testgroup system=yes"
ansible all -m group -a "name=testgroup state=absent"
ansible系列命令
ansible-galaxy
连接https://galaxy.ansible.com 下载相应的roles
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
Ansible-playbook
ansible-playbook hello.yml
cat hello.yml
#hello world yml file
- hosts: webservers
remote_user: root
tasks:
- name: hello world
command: /usr/bin/wall hello world
ansible-vault
功能:管理加密解密yml文件
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 创建新文件
ansible-console :可交互执行命令,支持tab
root@test(2)[f:10]$
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
设置并发数:forks n 例: forks 10
切换组: cd 主机组 例:cd webservers
列出当前主机组列表 :list
列出所有的内置命令:?或help
例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appservers
root@webservers (2)[f:5]$ list
root@webservers (2)[f:5]$ yum name=httpd state=present
root@webservers (2)[f:5]$ service name=httpd state=started
PLAYBOOK
playbook是由一个或多个"play"组成的列表
play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让它们联同起来按事先编排的的机制同唱一台大戏
playbook采用YAML语言编写
YAML语法简介
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年首次发表了这种语言,另外Ingy dotNET与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Another Markup Language ,在开发这种语言时,YAML的意思是:”YET Another Markup Language“(仍是一种标记语言)
特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML表达能力强,扩展性好
YAML可以基于流来处理
在单一档案中,可用连续三个连字号(---)区分多个档案。另外,还有选择性的连续三个点号(…)表示档案的结尾
次行开始正常写playbook内容,一般建议写明该Playbook的功能
使用#号注释代码
缩进必须是统一的,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
k/v的值可同行写也可换行写,同行使用:分隔
v是个字符串,也可能是一个列表
一个完整的代码块功能需最少元素需包括name: task
一个name只能包括一个task
YAML文件扩展名通常为yml或yaml
List:列表,其所有元素均使用”-“打头
示例:
A list of tasty fruits
-Apple
-Orange
-Strawberry
-Mango
Dictionary:字典,通常由多个key与value构成
示例:
An employee record
name: Example Developer
job: Developer
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
例:
An employee record
{name:Example Developer,job:Developer,skill:Elite}
playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers和notity结合使用,由特定条件出发的操作,满足条件方才执行,否则不执行
tags标签 指定某条任务执行,用于选择运行playbook中的代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片段
ansible-playbook -t tagsname useradd.yml
Ansible playbook基础
Hosts:
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。
形式:
one.example.com
192.168.200.5
192.168.200.*
webservers:dbservers 两个组的并集
wenservers:&dbservers 两个组的交集
webservers:!phoeix 在webservers组,但不在dbservers组
示例: - hosts: webservers :dbservers