运维自动化发展历程及技术应用
- IAAS基础设置即服务,提供硬件服务
- PAAS平台即服务,提供操作系统服务
- SAAS软件即服务,提供整套服务
ansible的安装
yum -y install ansible
ansible –version 查看版本信息
/etc/ansible/ansible.cfg 配置文件
/etc/ansible/hosts 控制的主机列表
/etc/ansible/roles 角色
添加主机清单,在/etc/ansible/hosts文件中添加主机
可以以分组添加形式添加,如:
连接被控制的主机,ansible是基于ssh协议,
[root@centos7 ~]#ansible appsrv -m ping -k
appsrv代表配置文件中定义的主机列表,-m表示模块,-k提供用户名口令
ansible all -m ping all代表所有主机
ansible 配置文件
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#日志文件 建议开启
ansible-doc:显示模块帮助
Ansible-doc -a 显示所有模块的文档
Ansible-doc -l 列出可用模块
Ansible-doc -s 显示指定模块的playbook片段
例:ansible-doc ping 显示ping模块的用
ansible<host-pattern> [-m module_name] [-a args]
–version 显示版本
-m module指定模块,默认为command
-v 详细过程–vv-vvv更详细
–list-hosts 显示主机列表,可简写—list
-k, –ask-pass 提示连接密码,默认Key验证
-K, –ask-become-pass 提示输入sudo
-C, –check 检查,并不执行
-T, –timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, –user=REMOTE_USER 执行远程执行的用户
-b, –become 代替旧版的sudo切换
例:–list-hosts显示主机列表
[root@centos7 .ssh]#ansible all –list-hosts
hosts (3):
192.168.67.131
192.168.67.132
192.168.67.53
[root@centos7 .ssh]#ansible appsrv –list-hosts
hosts (2):
192.168.67.131
192.168.67.132
基于key验证,用户不用输入密码
ssh-keygen
Ssh-copy-id hostIP 分别输入不同主机ip
[root@centos7 .ssh]#ansible all -m ping
192.168.67.131 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
192.168.67.53 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
192.168.67.132 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
ansible的Host-pattern
匹配主机的列表
All :表示所有Inventory中的所有主机
ansibleall –m ping
* :通配符
ansible“*” -m ping
ansible192.168.1.* -m ping
ansible“*srvs” -m ping
或关系
ansible“websrvs:appsrvs” -m ping
ansible“192.168.1.10:192.168.1.20” -m ping
逻辑与
ansible“websrvs:&dbsrvs” –m ping
在websrvs组并且在dbsrvs组中的主机
逻.非
ansible‘websrvs:!dbsrvs’ –m ping
在websrvs组,但不在dbsrvs组中的主机
综合逻辑
ansible‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正则表达式
ansible“websrvs:&dbsrvs” –m ping
ansible“~(web|db).*\.magedu\.com” –m ping
ansible 模块介绍
command模块为默认模块,可以省略不写
[root@centos7 .ssh]#ansible all -a ‘creates=/etc/passwd cat /etc/fstab’
192.168.67.53 | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
192.168.67.131 | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
192.168.67.132 | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
creates=/etc/passwd 表示如果文件存在,后面的命令不执行
removes=/etc/passwd 表示如果文件不存在,后面的命令不执行
[root@centos7 .ssh]#ansible all -a ‘chdir=/boot ls’ 查看boot目录
command不支持重定向、变量、管道,shell模块支持
如:
[root@centos7 .ssh]#ansible all -a ‘echo $HOSTNAME’
192.168.67.53 | SUCCESS | rc=0 >>
$hostname
192.168.67.131 | SUCCESS | rc=0 >>
$hostname
192.168.67.132 | SUCCESS | rc=0 >>
$hostname
shell模块,
[root@centos7 .ssh]#ansible all -m shell -a ‘echo $HOSTNAME’
192.168.67.53 | SUCCESS | rc=0 >>
centos6.91
192.168.67.131 | SUCCESS | rc=0 >>
centos6.9
192.168.67.132 | SUCCESS | rc=0 >>
centos7.5
script模块,本机的脚本在所有主机上执行
[root@centos7 data]#vim host.sh
[root@centos7 data]#chmod +x host.sh
[root@centos7 data]#ansible all -m script -a ‘/data/host.sh’
192.168.67.131 | SUCCESS => {
“changed”: true,
“rc”: 0,
“stderr”: “Shared connection to 192.168.67.131 closed.\r\n”,
“stdout”: “centos6.9\r\n”,
“stdout_lines”: [
“centos6.9”
]
}
copy模块,将本机的文件复制到远程
ansible-doc copy
例:关闭所有主机selinux
[root@centos7 data]#ansible all -m shell -a ‘getenforce’
192.168.67.53 | SUCCESS | rc=0 >>
Disabled
192.168.67.131 | SUCCESS | rc=0 >>
Disabled
192.168.67.132 | SUCCESS | rc=0 >>
Enforcing
[root@centos7 data]#ansible all -m shell -a ‘ls -l /etc/sysconfig/selinux’
192.168.67.53 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 17 Apr 29 20:18 /etc/sysconfig/selinux -> ../selinux/config
192.168.67.131 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 17 Apr 8 12:34 /etc/sysconfig/selinux -> ../selinux/config
192.168.67.132 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 17 May 29 04:03 /etc/sysconfig/selinux -> ../selinux/config
复制配置好的文件到所有远程主机(要注意版本不同)
ansible all -m copy -a ‘src=/data/config dest=/etc/selinux/ backup=yes’
ansible all -m shell -a ‘reboot’
[root@centos7 data]#ansible all -a ‘getenforce’
192.168.67.131 | SUCCESS | rc=0 >>
Disabled
192.168.67.132 | SUCCESS | rc=0 >>
Disabled
192.168.67.53 | SUCCESS | rc=0 >>
Disabled
例:生成一个文件并且指定内容
[root@centos7 data]#ansible all -m copy -a ‘content=”hello\nhi” dest=/data/file’
[root@centos7 data]#ansible all -a ‘cat /data/file’
192.168.67.53 | SUCCESS | rc=0 >>
hello
hi
192.168.67.131 | SUCCESS | rc=0 >>
hello
hi
192.168.67.132 | SUCCESS | rc=0 >>
hello
hi
fecth模块,从远程主机抓取单个文件,暂时不能是目录
[root@centos7 data]#ansible all -m fetch -a ‘src=/var/log/messages dest=/data/’
dest=/data/表示本机目录
[root@centos7 data]#tree /data
/data
├── 192.168.67.131
│ └── var
│ └── log
│ └── messages
├── 192.168.67.132
│ └── var
│ └── log
│ └── messages
└── 192.168.67.53
└── var
└── log
└── messages
9 directories, 3 files
如果需要抓取多个文件。可以将文件先打包,然后抓取
file模块,设置文件属性
[root@centos7 data]#ansible all -m file -a ‘dest=/data/f1 state=touch’ 创建文件
state=touch、absent、directory、link absent表示删除、directory表示创建文件夹
dest 、name、 path三个单词效果是等价
创建链接
[root@centos7 data]#ansible all -m file -a ‘src=/etc/fstab dest=/data/fstab.link state=link’
删除链接
[root@centos7 data]#ansible all -m file -a ‘dest=/data/fstab.link state=absent’
hostname模块,更改主机名
ansible 192.168.67.53 -m hostname -a ‘name=centos6’
cron模块,创建计划任务
ansible all -m cron -a ‘minute=* weekday=1,3,5 job=”/usr/bin/wall hello how are you !” name=notice’
禁用计划任务
ansible all -m cron -a ‘disabled=true job=”/usr/bin/wall hello how are you !” name=notice’
job和name都需要指定,
删除计划任务
ansible all -m cron -a ‘job=”/usr/bin/wall how are you !” name=notice state=absent’
yum模块
ansible all -m yum -a ‘name=vsftpd’ 安装vsftp
ansible all -m yum -a ‘name=vsftpd state=removed’ 卸载
批量安装包ansible all -m yum -a ‘name=vsftpd,dhcp,http’
批量卸载,同上
单独安装某个包,假设此包在ansible客户端上没有
- 把安装包复制到客户端上
ansible all -m copy -a ‘src=/data/tree-1.6.0-10.el7.x86_64.rpm dest=/root’
- 安装
ansible all -m yum -a ‘name=/root/tree-1.6.0-10.el7.x86_64.rpm disable_gpg_check=yes’
清除yum缓存
ansible all -m yum -a ‘name=dstat update_cache=yes’
service模块,管理服务
ansible all -m service -a ‘name=vsftpd state=started enabled=yes’ 启动服务,并且开机启动
restarted ,stop
user模块
创建nginx系统用户
[root@centos7 data]#ansible all -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=110’
删除用户并删除家目录
ansible all -m user -a ‘name=nginx state=absent remove=yes’
group管理组
创建组
ansible all -m group -a ‘name=wang system=yes gid=110’
删除组
ansible all -m group -a ‘name=wang system=yes state=absent’
ansible-galaxy
连接https://galaxy.ansible.com 下载相应的roles
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
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:2.0+新增,可交互执行命令,支持tab
root@test(2)[f:10] $
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
设置并发数:forks n 例如:forks 10
切换.:cd 主机组例如:cd web
列出当前组主机列表:list
列出所有的内置:?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs(2)[f:5]$ yum name=httpdstate=present
root@appsrvs(2)[f:5]$ service name=httpdstate=started
playbook的编写
—
– hosts: appsrv
remote_user: root
tasks:
– name: install httpd
yum: name=httpd
– name: install configure file
copy: src=/root/httpd.conf dest=/etc/httpd/conf
– name: start service
service: name=httpd state=started enabled=yes
运行playbook方式
ansible-playbook fileyml –check 只检测
ansible-playbook fileyml
ansible-playbook fileyml –limit websrv 只针对主机列表中的某些主机执行
-v -vv -vvv显示过程
ansible-playbook file.yml –list-tasks 查看playbook中task
ansible-playbook file.yml –list-hosts 查看playbook中主机
handlers和notify结合使用触发条件
安装http服务,假如以下playbook已经执行,所有操作已经完成,但之后配置文件发生修改,需重新执行,但服务已经重启过,此条任务将不执行,而无法重新加载配置文件,
解决方法
还可触发多个
-hosts: websrvs
remote_user: root
tasks:
-name: add group nginx
tags: user
user: name=nginxstate=present
-name: add user nginx
user: name=nginxstate=present group=nginx
-name: Install Nginx
yum: name=nginxstate=present
-name: config
copy: src=/root/config.txtdest=/etc/nginx/nginx.conf
notify:
-Restart Nginx
-Check NginxProcess
handlers:
-name: Restart Nginx
service: name=nginxstate=restarted enabled=yes
-name: Check Nginxprocess
shell: killall-0 nginx> /tmp/nginx.log
playbook中tags使用
ansible-playbook -t install,start httpd.yml 可以选择标签执行
也可以将两个标签的设为同一名字,执行时将同时执行两个任务
playbook中变量的使用
1.执行的时候给变量赋值
2.在playbook中定义变量
- 在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义同一变量
ansible-playbook app.yml
变量优先级
命令行 playbook 主机清单 模板文件
setup模块定义了系统自带的变量
如:查看ansible_fqdn变量
ansible all -m setup -a ‘filter=”ansible_fqdn”‘
变量可以专门写入一个文件中,然后调用就可以
如:在/etc/ansible/下创建一个vars.yml
var1: httpd
var2: vsftpd
编写剧本调用
ansible-playbook testvars.yml
模板templates
Jinja2语言,使用字面量,有下面形式
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and, or, not
流表达式:For If When
模板文件放置没有严格要求,可以在ansible目录下创建文件夹templates,和playbook平级
template也是个模块,只能用于playbook,不能用于ansible命令行中
templates功能:根据模块文件动态生成对应的配置文件
templates文件必须存放于templates目录下,且命名为.j2 结尾
yaml/yml文件需和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
利用template,引用变量
例:nginx的安装,
在/etc/ansible/下创建templates目录
1.复制模板文件并且改名以.j2为后缀
cp /etc/nginx/nginx.conf /etc/ansible/templates/nginx.conf.j2
2.编辑模板文件,引用一个变量,cpu个数变量ansible_processor_vcpus,此时的cup个数为1
ansible all -m setup | grep processor
vim /etc/ansible/templates/nginx.conf.j2
3.编写playbook
4.执行playbook
ansible-playbook temnginx –limit 192.168.67.132
5.根据变量引用,worker process变为原来4倍
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100290