本文共 7659 字,大约阅读时间需要 25 分钟。
实验前提:三台CentOS7和一台CentOS6,其中一台CentOS7当作Ansible堡垒机,其余三台主机当作被控主机。四台主机均为最小化安装,全部配置好了yum源,包括本地和EPEL源,禁用了防火墙和SELINUX。每个主机上面都增加了一块桥接网卡可供安装EPEL源资源。分别设置各个主机的主机名为ansible,node1-centos7,node2-centos7,node3-centos,使用Ansible管理,最好基于SSH KEY验证,这样就不用输入各个主机的密码了。
#hostnamectl set-hostname ansible-centos7
其余两台Centos7按下图更改类似,更改完毕后,重新登入生效
#hostname node3-centos6
#vim /etc/hosts 在第一行最后增加node3-centos6
# vim /etc/sysconfig/network
添加如下
HOSTNAME=node3-centos6.localdomain
ssh-keygen
生成密钥对-实验用处,故没有对私钥加密,生产环境看需要[root@ansible-centos7 ~] # ssh-copy-id 172.16.36.132 **
同样拷贝到另外两台被控主机,即可直接SSH IPADDR
yum源配置就位,外网卡连接就位,开始安装ansible
#yum install ansible 没任何意外安装成功#vim /etc/ansible/ansible.cfg
找到下面的一行,将 #号删除,此项是为了SSH远程主机IP时,检查对应服务器的host_key,不输入YES。,建议取消注释
找到下面的一行,将 #号删除,更改command为shell。此项为Ansible不加-m MODULE时默认调用模块。
ansible.cfg中对返回的消息不同颜色的释义
如果想要使用ansible的话,需要将被控主机IP放入到hosts目录中,如下图,参照内部说明即可定义。同一个主机IP可以同时属于不同组
测试Ansible ping模块-返回正常,表明堡垒机配置成功。
Ansible一共有2080个模块,学无止境。
先收工回去休息^.^,Ansible批量关机
1, # ansible websrv -m ping -v|-vv|-vvv 显示详细或更详细过程
2, # ansible |172.16.36.12|websrv|appsrv|all -m ping hostpattern可以使用通配符,别名,ip地址。前提在/etc/ansible/hosts中有定义
3, # ansible ‘websrv:!appsrv’|'websrv:&appsrv' -m ping hostpattern也可以使用逻辑与&,逻辑非!,以及正则表达式(需要以~开头),来取得hosts中的IP
4, # ansible-doc -s shell 查看shell这个模块的说明
5, # ansible websrv -a ‘echo $HOSTNAME’ 查看被控主机时,变量引用需要在单引号中,双引号无效(显示本机主机名),双引号中可以写命令(如果命令中还有需要使用引号的选项,则使用单引号)
6, # ansible websrv -a 'sed -i "s@SELINUX=disabled@SELINUX=permissvie@" /etc/selinux/config'批量修改selinux配置文件
command,shell,script,copy,fetch,file,unarchive,hostname,cron,yum,service,user,group,setup
1,script 脚本模块直接在被控主机执行本机脚本# vim hello.shhostname > /data/hostname.log# ansible websrv -m script -a '/root/hello.sh'
2,copy 拷贝模块将本机文件复制到被控主机上,可指定相应内容
# ansible websrv -m copy -a 'src=/root/hello.sh dest=/data/ owner=martin group=bin mode=600'
写内容并在被控主机生成文档
# ansible websrv -m copy -a 'content="hello\nlinux" dest=/data/my.txt'
源文件覆盖被控主机文件,提前备份主机文件
# ansible websrv -m copy -a 'src=/root/hello.sh dest=/data/my.txt backup=yes
3,fetch抓取模块被控端主机文件抓取到本地机,目前支支持文件抓取,需要抓取目录内所有数据的话,先打包
抓取过来同时保持目录结构# ansible websrv -m fetch -a 'src=/data/my.txt dest=/root/'
4,file文件模块设置文件属性创建软硬链接 state=touch(空文件)|directory(目录)|link(软链接)|hard(硬链接)|absent(删除,不支持通配符*)
# ansible websrv -m file -a 'path=/data/root owner=martin mode=000'
创建软链接
# ansible websrv -m file -a 'src=/data/hello.sh path=/data/hello.sh.link state=link'
创建硬链接
# ansible websrv -m file -a 'src=/data/hello.sh path=/data/hello.sh.hardlink state=hard'
5,unarchive解压模块解压文件到被控主机如果copy不指定no,默认copy为yes相当于把本机打包文件拷贝到被控主机上,再解压。
# ansible websrv -m unarchive -a 'src=/root/root.tar dest=/data/'
当copy=no时,src指定网上的压缩包
# ansible websrv -m unrchive -a ‘src=https://example.com/example.zip dest=/usr/local/bin copy=no’
6,hostname 主机名模块 更改主机名如果要定义不同主机不同主机名,需要用到变量,此方式修改,直接修改主机名的配置文件centos6:/etc/sysconfig/networks,centos7:/etc/hostname,永久生效。
# ansible 172.16.36.142 -m hostname -a 'name=test.localdomain'
7,cron 计划任务支持时间:minute,hour,day,month,weekday每5分钟执行一次向堡垒机同步时间。
# ansible 172.16.36.112 -m cron -a 'name=synctime minute=*/5 job="ntpdate 172.16.36.122 &> /dev/null"'
# ansible all -m cron -a 'name=synctime minute=*/5 job="ntpdate 172.16.36.122 &> /dev/null" disabled=true'
删除名字为synctime的任务项
# ansible all -m cron -a 'name=synctime state=absent'
8,yum 安装模块 安装服务等
# ansible appsrv -m yum -a 'name=httpd state=present' 安装# ansible appsrv -m yum -a 'name=httpd state=absent' 卸载
9,service 服务模块对服务状态做出控制
# ansible appsrv -m service -a 'name=httpd state=started|stoppted|reloaded|restarted' 服务管理# ansible appsrv -m service -a 'name=httpd enabled=yes' 开机是否自启动
10,user用户模块创建用户使用创建mysql为系统用户,指定家目录,但不创建家目录
# ansible appsrv -m user -a 'name=mysql system=yes shell=/sbin/nologin home=/usr/local/mysql create_home=no'
删除mysql用户
# ansible appsrv -m user -a 'name=mysql state=absent'
删除mysql用户,如果家目录存在的话,删除之
# ansible appsrv -m user -a 'name=mysql remove=true state=absent'
11,group组模块创建组使用创建mysql组
# ansible appsrv -m user -a 'name=mysql system=yes'
删除mysql组
# ansible appsrv -m user -a 'name=mysql state=absent'
12,setup主机信息模块
# ansible appsrv -m setup -a 'filter="*hostname*"'
连接 下载相应的roles安装galaxygeerlingguy.redis开发者姓名.角色
# ansible-galaxy install geerlingguy.redis
删除galaxy
# ansible-galaxy remove geerlingguy.redis
执行脚本前检查有无错误,可使用ansible-playbook -C xxx.yml
严格区分空格,对其方式,第一次写头大
# vim wall_helo.yml
执行yml文件
# ansible-playbook wall_helo.yml
# vim install_httpd.yml
执行脚本
# ansible-playbook install_httpd.yml
配置文件端口已被修改为8000执行结果:
# vim create_mysql.yml
执行结果:
针对上述install_httpd.yml,改进如下
针对上述install_httpd.yml,改进如下
针对上述install_httpd.yml,改进如下指定tags定义的内容,只执行此tags内的列表内容,可多个tags同时执行,用逗号分隔。tags定义的内容可以相同,同时执行相同tags内的列表内容。
# ansible-playbook -t config install_httpd.yml
ansible_hostnameansible_nodenameansible_fqdn ansible_memtotal_mbansible_processor_vcpus
1,使用setup模块内部变量
# vim create_file.yml
执行结果:
2,定义普通变量
# vim /etc/ansible/hosts 如下图针对不同IP增加port变量
# vim create_file.yml# 创建文件名时加上{ {port}},调用上面/etc/ansible/hosts里port变量里的值。
查看结果
3,定义公共组变量
# vim /etc/ansible/hosts 如下图针对某个组内增加martin变量
# vim create_file.yml# 创建文件名时加上{ {martin}},调用上面/etc/ansible/hosts里martin变量里的值。
4,定义公共组变量和普通变量,其中有一个IP没定义port变量
# vim /etc/ansible/hosts
结论:变量优先级:普通变量优先级大于公共变量
5,命令行变量直接定义-e
# ansible-playbook -e port=9527 create_file.yml
结论:命令行变量优先级大于普通变量优先级大于公共变量
6,直接在yml脚本内定义变量
# vim create_file.yml
结论:yml文件内变量优先级大于普通变量优先级大于公共变量
7,变量单独定义在另一个yml文件中
# vim vars.yml
# vim create_file.yml
结论:单独yml定义变量优先级在执行的yml脚本内变量之上
8,命令行定义变量,yml脚本内定义变量,同时定义普通变量和公共变量
# ansible-playbook -e port=9999 create_file.yml
结论:命令行定义变量优先级最高外部yml定义变量优先级第二yml内定义变量优先级第三普通变量优先级第四公共变量优先级第五
根据模板内容动态生成对应的配置文件,模板文件必须存放在templates目录下,且后缀为.j2,此目录和yml文件存放目录平级。
模板应用之一:httpd
# vim templates/httpd.conf.j2 找到Listen这行,将端口改为9999修改上面的install_httpd.yml
执行结果:通过template功能拷贝文件到被控主机端覆盖文件
模板应用之二:nginx
# vim install_nginx.yml
跑一下yml脚本,安装成功后,可以看下nginx线程数,但由于使用最小安装,pstree竟然都没有,自己安装下》。》
# ansible appsrv -a 'yum install psmisc -y'
查看一下进程树,ngnix的线程数和cpu内核数量有关,但可后期人为更改,需要用到template,
把配置文件先拷贝到templates文件夹内
# cp /etc/nginx/nginx.conf templates/nginx.conf.j2
使用setup模块找到cpu对应的变量,进而去修改nginx.conf里的线程数量,改变启动后的线程数
# vim nginx.conf.j2
更改如下,将线程数改为cpu内核数量+2个。
# vim install_nginx.yml
修改如下 ,然后跑一遍
结果:线程数增加
模板应用之三:when的使用
根据被控主机系统不同应用不同模板时,就需要使用到when还是拿httpd服务实验,websrv里有一台主机是centos6,另一台是centos7。事先在templates文件夹里放入两个不同版本的httpd.conf.j2。为了加以区分,6的端口号改为90,7的端口号改为4444yml文件内容
跑一遍yml文件结果:
迭代:with_items的使用
使用方法之一:创建不同名称文件# cp create_file.yml create_file2.yml# vim create_file2.yml
跑一遍yml脚本结果:迭代生成多个文件。
使用方法之二:创建用户和与之对应的组(with_items和字典{})
执行结果:创建用户成功,组相对应
模板应用之四:for if使用test.conf.j2模板,动态生成多个不同内容的配置文件
# vim test.conf.j2
定义默认端口,如果yml文件里没给出端口号,会使用模板默认端口,if用法,如果定义了,就使用定义的,没定义就置为空。
再写一个yml脚本:
执行结果:
管理加密解密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命令
Ansible-console:2.0+新增,可交互执行命令,支持tabroot@test (2)[f:10] $执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$设置并发数: forks n 例如: forks 10切换组: cd 主机组 例如: cd web列出当前组主机列表: list列出所有的内置命令: ?或help示例:root@all (2)[f:5]$ listroot@all (2)[f:5]$ cd appsrvsroot@appsrvs (2)[f:5]$ listroot@appsrvs (2)[f:5]$ yum name=httpd state=presentroot@appsrvs (2)[f:5]$ service name=httpd state=started
转载于:https://blog.51cto.com/5033330/2385615