运维自动化部署

CentOS系统启动流程:
bootloader(引导模式)>kernel(内核)>rootfs(根文件系统)>/sbin/init(开机启动服务)

安装程序启动过程:
MBR:isolinux/boot.cat 
stage2: isolinux/isolinux.bin 
配置文件:isolinux/isolinux.cfg
每个对应的菜单选项:
加载内核:isolinuz/vmlinuz
向内核传递参数:append initrd=initrd.img …

装载根文件系统,并启动anaconda (在启动流程选项界面)
默认启动GUI接口
若是显式指定使用TUI接口:向内核传递text参数即可
(1)按tab键,在后面增加text
(2)按ESC键:boot: linux text

系统手动指定安装源安装:
1、在启动流程界面;按Esc:输入boot:linux askmethod

2、显示界面后,第三个界面选择 URL

3、DHCP自动分配。

4、输入远程http服务器:http://172.20.0.1/centos/6 (仅是教室环境)

安装时选MINI最小化安装时,如果有需要加图形界面,查找Desktop包组。
安装图形界面包组:yum groupinstall Desktop
init 5 切换

anaconda的配置方式:
(1) 交互式配置方式(手动)
(2) 通过读取事先给定的配置文件自动完成配置(自动)
按特定语法给出的配置选项
kickstart文件

安装boot引导选项:boot: (安装选项界面时,按Esc)

文本安装方式:输入 linux text 

手动指定使用的安装方法:输入 linux askmethod


与网络相关的引导选项:(装系统界面按Esc,root:linux ip=…… network=……)
ip=IPADDR
netmask=MASK
gateway=GW
dns=DNS_SERVER_IP
ifname=NAME:MAC_ADDR 
与远程访问功能相关的引导选项:
vnc
vncpassword=’PASSWORD’

指明kickstart文件的位置:(安装类型和路径) ks=

DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard drive: ks=hd:device:/directory/KICKSTART_FILE
HTTP server: ks=http://host:port/path/to/KICKSTART_FILE
FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE
HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
NFS server:ks=nfs:host:/path/to/KICKSTART_FILE

anaconda-ks.cfg 文件,就是安装格式

创建kickstart(安装)文件方式:

依据某模板修改并生成新配置 (修改此文件也可生成自动化文件)
/root/anaconda-ks.cfg (复制一份出来,修改成需要安装的模板)
使用创建工具:
system-config-kickstart

ksvalidator ks6.cfg 可检查语法是否有错误

kickstart文件格式:(此文件是系统自动化安装文件)

安装kickstart包:yum install system-config-kickstart

启动创建工具:system-config-kickstart

设定好后生成ks6.cfg文件

将ks6.cfg文件放到 /var/www/html/下

从网页上可查找安装包ks.cfg ;http://172.20.110.91/ks6.cfg

自动化安装时可直接调用安装包

自动化安装程序:(http安装)

启动流程界面:按Esc 进入:boot:

boot:linux ip=172.20.0.111 netmask=255.255.0.0 ks=http://172.20.110.91/ks6.cfg
(随意指定一个IP,用来临时连接网络安装包) (ks后面跟安装包地址)

CentOS 7 制作kickstart自动化文件:

把本地yum源[base] 修改成[development] (可解决安装插件)
(vim /etc/yum.repo.d/base.repo)

2018/05/25

DHCP服务:(动态主机配置协议)

给在同一网段的主机分配动态IP。

主要用途:
用于内部网络和网络服务供应商自动分配IP地址给用户
用于内部网络管理员作为对所有电脑作集中管理的手段
使用场景:
自动化安装系统 
解决IPV4资源不足问题

地址分配记录 /var/lib/dhcpd/dhcpd.leases

dhclient -d 查看DHCP连接过程

其他配置选项:
filename: 指明引导文件名称
next-server:提供引导文件的服务器IP地址 
示例:
filename “pxelinux.0”;
next-server 192.168.100.100;

service dhcpd configtest 检查语法

配置dhcp文件文件:vim /etc/dhcp/dhcpd.conf

配置DHCP服务器:

关闭防火墙和selinux(getenforce)。

1、yum install dhcpd (安装包)

2、systemctl start dhcpd (启动服务)

3、修改配置文件;重新加载服务;reload,restart

4、测试

网卡模式不能桥接;

示例:
vim /etc/dhcp/dhcpd.conf (修改配置文件)

option domain-name “magedu.org”;
option domain-name-servers 114.114.114.114,1.1.1.1;
option routers 192.168.30.200;
default-lease-time 86400;
max-lease-time 100000;
subnet 192.168.30.0 netmask 255.255.255.0 { (本机段网络)
range 192.168.30.10 192.168.30.100; (分配网络范围)
option routers 192.168.30.254; (网关1或254)
option domain-name-servers 8.8.8.8;
next-server 192.168.30.7;
filename “pxelinux.0”;
}
subnet 6.6.6.0 netmask 255.255.255.0 {
range 6.6.6.1 6.6.6.100;
}

host testclient {
hardware ethernet 00:0c:29:e1:f7:aa;
fixed-address 192.168.30.6;
option routers 192.168.30.123;
option domain-name-servers 223.5.5.5;

tftp server pxelinux.0

}

HTTP服务目录:/var/www/html/

TFTP服务:
1、yum install tftp-server (安装包)

2、systemctl start tftp.socket (启动tftp服务)

3、systemctl enable tftp.socket (开机启动tftp服务)

防火墙配置:

systemctl status firewalld / iptables -vnL 检查防火墙状态

systemctl stop firewalld 临时关闭防火墙

systemctl disable firewalld 禁止开机启动防火墙

systemctl enable firewalld 开机启动防护墙

service iptables status Centos6 查询防火墙

PXE: (引导和安装操作系统)

PXE自动化安装CentOS 7 :

安装前确定 关闭防火墙和SElinux,DHCP服务器静态IP

1、安装包:

yum install dhcp tftp-server httpd syslinux (安装4个服务)

systemctl enable dhcpd httpd tftp.socket (3个设为开机启动服务)

systemctl start httpd (开启httpd服务)

2、准备yum源:

mkdir -pv /var/www/html/centos/7/ (在http服务下创建yum源目录)

vim /etc/fstab 文件下加入: (将光盘挂载到http yum源目录,并保存文件)
/dev/sr0 /var/www/html/centos/7/ iso9660 defaults 0 0

mount -a (挂载)
df (查看挂载)

3、准备ks文件:

mkdir -pv /var/www/html/ksdir/7 (在http服务下创建ks目录)

cp /root/anaconda-ks.cfg /var/www/html/ksdir/7/ks7_desktop.cfg
(把ks文件模板复制到http服务目录下,并改名为ks7_desktop.cfg)

chmod +r /var/www/html/ksdir/7/ks7_desktop.cfg
(将ks7_desktop.cfg文件+读权限)

vim /var/www/html/ksdir/7/ks7_desktop.cfg
(编辑ks模板文件)

(文件需要修改的内容)
url –url=http://192.168.30.7/centos/7
text
reboot
network –bootproto=dhcp –device=ens33 –onboot=on –ipv6=auto –activate
network –hostname=centos7.magedu.com
# Root password
zerombr
%packages
@base
@core
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@print-client
@x11
autofs
%end

%addon com_redhat_kdump –enable –reserve-mb=’auto’
%end
%post
systemctl enable autofs
systemctl disable initial-setup.service
systemctl set-default multi-user.target

rm -rf /etc/yum.repos.d/*
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=file:///misc/cd
gpgcheck=0
EOF

%end

4、配置dhcp服务:

cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
(将dhcp配置文件示例复制到dhcp配置文件)

vim /etc/dhcp/dhcpd.conf (编辑dhcp配置文件)

(需要修改的内容)
option domain-name “zhang.org”;
option domain-name-servers 114.114.114.114,1.1.1.1;
option routers 192.168.30.200;
default-lease-time 86400;
max-lease-time 100000;
subnet 192.168.30.0 netmask 255.255.255.0 { (本网段网络)
range 192.168.30.10 192.168.30.100; (分配地址范围)
option routers 192.168.30.254; (网关1或254)
option domain-name-servers 8.8.8.8;
next-server 192.168.30.7;
filename “pxelinux.0”;
}
systemctl start dhcpd

5、准备PXE相关文件

rpm -ql syslinux (查看syslinux所有配置文件)

mkdir /var/lib/tftpboot/pxelinux.cfg/ (创建启动选项界面目录)

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
(将syslinux配置文件pxelinux.0复制到/var/lib/tftpboot/目录)

cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
(将syslinux配置文件menu.c32复制到/var/lib/tftpboot/目录)

cp /misc/cd/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/

cp /misc/cd/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

vim /var/lib/tftpboot/pxelinux.cfg/default
(编辑启动选项界面)

(编辑修改的内容)
default menu.c32
timeout 600

menu title Auto Install CentOS

label desktop
menu label Install ^Desktop CentOS 7
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.30.7/ksdir/7/ks7_desktop.cfg

label mini
menu label Install ^Mini CentOS 7
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.30.7/ksdir/7/ks7_mini.cfg

label local
menu default
menu label Boot from ^local drive
localboot 0xffff

menu end

6、检查http服务路径是否能查看ks内容;
终端启动加载时按Esc;选择第四项 网络安装。

cobbler介绍:(全自动化安装)

发行版:
表示一个操作系统版本,它承载了内核和initrd的信息,以及内核参数等其他数据。
配置文件:
包含一个发行版、一个kickstart文件以及可能的存储库,还包含更多特定的内核参数等其他数据。

实现cobbler全自动化安装:

1 安装包
yum install cobbler(EPEL) dhcp
systemctl enable cobblerd dhcpd httpd tftp
systemctl start cobblerd httpd tftp

2 cobbler check

3
vim /etc/cobbler/settings
server:cobberserverip
next_server:cobberserverip
defaut_password_cryptd: “xxxxxxxxxx” #openssl passwd -1 生成口令
manage_dhcp:1

4
cobber get-loaders 联网
cobbler sync

5
vim /etc/cobbler/dhcp.template
subnet 192.168.30.0 netmask 255.255.255.0
range dynamic-bootp 192.168.30.10 192.168.30.200;

cobbler sync

systemctl restart dhcpd

6
/dev/sr0 8490330 8490330 0 100% /mnt/cdrom0
/dev/sr1 6049912 6049912 0 100% /mnt/cdrom1

cobbler import –path=/mnt/cdrom0 –name=CentOS_7.4-x86_64 –arch=x86_64
cobbler import –path=/mnt/cdrom1 –name=CentOS_6.9-x86_64 –arch=x86_64
cobbler distro list

7
#cat ks6_mini.cfg
url –url=$tree

cp ks7_desktop.cfg ks6_mini.cfg /var/lib/cobbler/kicstarts/

cobbler profile add –name=CentOS_7.4-x86_64_Desktop –distro=CentOS_7.4-x86_64 –kickstart=/var/lib/cobbler/kicstarts/ks7_desktop.cfg
cobbler profile add –name=CentOS_6.9-x86_64_Mini –distro=CentOS_6.9-x86_64 –kickstart=/var/lib/cobbler/kicstarts/ks6_mini.cfg

删除自带的配置
cobbler profile remove –name=CentOS_7.4-x86_64
cobbler profile remove –name=CentOS_6.9-x86_64

8 web实现

yum install cobbler-web
systemctl restart httpd

htdigest -c /etc/cobbler/users.digest Cobbler test1

https://cobberserverip/cobbler_web/

2018/05/28

Ansible:(自动化运维工具)

ansible主控端 管理其他主机、网络设备

模块化:调用特定模块,完成特定任务。
利用ansible实现管理的方式:
ansible命令 主要用于临时命令使用场景;

ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划。

Ansible-playbook(剧本)执行过程:
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执 行

Ansible主要操作对象:
HOSTS主机
NETWORKING网络设备

EPEL源: yum install ansible 确认安装:ansible –version

/etc/ansible/ansible.cfg 主机配置文件,配置ansible工作特性

/etc/ansible/hosts 主机清单(编辑管理主机IP)

/etc/ansible/roles/ 存放角色的目录

在配置文件中:
#host_key_checking = False 检查对应服务器的host_key,建议取消注释(取消ssh验证)

#log_path = /var/log/ansible.log 日志文件,建议取消注释(开启日志文件)

在vim中 / 是查找;

程序:
ansible 主程序,临时命令执行工具

ansible-doc 查看配置文档,模块功能查看工具

ansible-playbook 定制自动化任务,编排剧本工具

ansible-pull 远程执行命令的工具

ansible-vault 文件加密工具

ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

ansible-console 基于Console界面与用户交互的执行工

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在主机清单文件中将其分组命名

主机清单中编辑管理主机IP: (可在IP地址后使用冒号加端口号)
vim /etc/ansible/hosts

1)在文本下方直接添加需要管理的主机IP

2)在文本下方分组管理主机IP;
[webserver]
172.20.30.1
172.20.30.2
172.20.30.3

[dbserver]
172.20.30.5
172.20.30.6
172.20.30.7

3)ip遵循1-10的;
[abserver]
172.20.30.[1:10]

/usr/share/my_modules/ 库文件存放目录

$home/.ansible/tmp 临时命令文件存放的目录

默认sudo用户root;远程端口号默认22;

Ansible 命令:
ansible
ansible-doc (查看模块帮助)
ansible-playbook (执行剧本任务)
ansible-vault
ansible-console
ansible-galaxy
ansible-pull

ansible -a 显示所有模块文档
-l, –list 列出可以模块
-s, –snippet 显示指定模块的playbook片段

示例:
ansible 192.168.169.170 -a ‘ls /data’
ansible-doc –l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc –s ping 查看指定模块帮助用法

实现基于key认证: ansible通过ssh实现配置管理、应用部署、任务执行等功能;
建议配置ansible 端能基于密钥认证的方式联系各被管理节点;

1、ssh-keygen 生成密钥对儿
2、ssh-copy-id 172.20.111.101 将公钥直接传输至对方

ansible –version 查看版本

-m 指定模块,默认为command

-v 显示过程 -vv -vvv 越来越详细

–list 显示主机列表;–list-hosts
ansible all –list

-C 查看,不执行

-T 执行命令的超时时间,默认10s
-u 执行远程执行的用户
-b 代替旧版的sudo切换

-k 提示了解密码,默认Key验证
-K 提示输入sudo

ansible all -m ping (all 是指在/ansible/hosts文件中的所有 IP)
(ping 是模板,测试是否和其他主机ping通)
ansible all -a ls

ansible all -m ping -u wang -k (以wang用户执行ping存活检测)

通配符:*
ansible “*” -m ping
ansible 192.168.1.* -m ping
ansible “*srvs” -m ping

与 或 非 逻辑关系:

与:ansible “websrvs:dbsrvs” -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组中的主机)

执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败(查看执行失败,说明没有)

常用模块:

command : 在远程主机执行命令,默认模块,可忽略-m选项;

ansible all -m command -a ‘systemctl restart httpd’
ansible all -a ‘systemctl restart httpd’

ansible all -a ‘chdir=/boot ls -l’ (chdir是切换至哪个目录,在执行)

command模块不支持 $ < > | ; & 等;用shell模块执行

shell : 和command相似,用shell执行命令;

ansible srver -m shell -a ‘echo magedu | passwd –stdin wang’

调用bash执行命令:将一些复杂命令写到脚本,然后使用copy复制到远程;
再用ansible all -m shell 统一执行;

ansible all -m shell -a ‘tar jcf /data/log.tar /var/log/*.log’
(将所有主机日志打包,放到data目录下)

script : 运行脚本模板;

(在本机服务器端 将脚本做好 不需要推送 直接运行脚本 则其他主机也可使用)

ansible all -m script -a f1.sh
(在所有主机上执行f1.sh脚本)

copy : 推送;从本机服务器复制文件到客户端;

如果目标存在,默认覆盖;
backup=yes 客户端主机备份

ansible srver -m copy -a “src=/data/f1.sh dest=/tmp/f2.sh”
(将本机服务器端f1.sh脚本 复制到srver组的主机 并改名为f2.sh)

ansible all -m copy -a “src=/etc/selinux/config dest=/etc/selinux/config backup=yes”
(将本机的config文件复制到所有主机上,如果目标存在,默认覆盖;所有主机先备份)

ansible srver -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
(复制到srver的主机 所有者改为 wang 权限改为 600 如果文件存在则备份)

ansible srver -m copy -a “content=’test content\n’ dest=/tmp/f1.txt”
(利用content生成内容,直接生成客户端目标文件)

fetch : 提取;从客户端提取文件至服务器端,与copy相反,目录可先tar打包,一次只能提取一个文件;

ansible all -m fetch -a ‘src=/var/log/messages dest=/data/’
(将所有主机的日志文件提取到本机/data目录下,会在/data目录下自动生成以IP为名称的目录)

打包,提取,解包:
ansible all -m shell -a ‘tar jcf /data/log.tar /var/log/*.log’
(将所有主机日志打包,放到log.tar文件下)

ansible all -m fetch -a ‘src=/data/log.tar dest=/data/’
(将打包好的日志文件 提取到/data/目录下的主机目录内)

tar xvf log.tar -C /data/
(将提取过来的日志文件 解包到/data目录下)

cron : 计划任务;
支持时间: minute, hour, day, month, weekday ( * 每的意思)

ansible all -m cron -a ‘minute=* weekday=1,3,5 job=”/usr/bin/wall FBI warning” name=warncron’
(将所有主机 设置成星期1,3,5,每分钟显示一次FBI warning;计划任务名为warncron;crontab -e 显示计划任务)

ansible all -m cron -a ‘disabled=yes job=”/usr/bin/wall FBI warning” name=warncron’
(禁用计划任务)

ansible all -m cron -a ‘disabled=no job=”/usr/bin/wall FBI warning” name=warncron’
(开启计划任务)

ansible all -m cron -a ‘job=”/usr/bin/wall FBI warning” name=warncron state=absent’
(删除计划任务)

file : 设置文件属性;

(状态)state=
touch 创建文件;absent 删除文件;
directory 创建目录;absent 删除目录;
link 创建软链接;absent 删除软链接;

ansible all -m file -a ‘name=/data/f2 state=touch’
(在data目录下创建f2空文件)

ansible all -m file -a ‘src=/etc/fstab dest=/data/fstab.link state=link’
(将所有主机的fstab文件 创建软连接fstab.link)

ansible all -m file -a ‘dest=/data/fstab.link state=absent’
(删除软链接)

hostname : 管理主机名;
ansible all -m hostname -a ‘name=zcyyy’
(修改主机名,会修改文件)

yum : 管理包;

ansible all -m yum -a ‘name=httpd state=latest’ 安装 (默认)
ansible all -m yum -a ‘name=httpd state=absent’ 删除

service : 管理服务;

ansible all -m service -a ‘name=httpd state=stopped’
(关闭所有主机的 httpd 服务)

ansible all -m service -a ‘name=httpd state=started’
(开启所有主机的 httpd 服务)

ansible all –m service –a ‘name=httpd state=reloaded’
(重新加载所有主机的 httpd 服务)

ansible all -m service -a ‘name=httpd state=restarted’
(重启所有主机的 httpd 服务)

ansible all -m service -a ‘name=vsftpd state=started enabled=yes’
(将所有主机vsftpd服务 开启,并设为开机启动) no

user : 管理用户;

ansible all -m user -a ‘name=yang shell=/sbin/nologin system=yes home=/var/yang group=root uid=80 comment=”yang service”‘
(在所有主机上创建yang账号,shell类型;是一个系统账号;家目录是/var/yang;主组root;uid设为80;最后加注释信息)

ansible all -m user -a ‘name=yang state=absent remove=yes’
(删除用户yang;还有家目录)

ansible all -m user -a ‘name=zhang system=yes home=/app/zhang groups=bin’
(创建用户zhang,是个系统账号,家目录为/app/zhang,附加组为 bin)

group : 管理组;

ansible all -m group -a “name=testgroup system=yes uid=90”
(创建testgroup组,是个系统组,uid为90)

ansible all -m group -a “name=testgroup state=absent”
(删除组)

ansible 系统命令;

连接https://galaxy.ansible.com 下载相应的角色roles

安装galaxy: ansible-galaxy install geerlingguy.redis(可直接从对应网站下载)

列出所有已安装的galaxy: ansible-galaxy list

删除galaxy: ansible-galaxy remove geerlingguy.redis

安装的角色在 .ansible/roles/ 目录下

push 推送
pull 拉取

ansible-console : 可交互执行命令,支持tab

root@test (2)[f:5]$
执行用户@当前操作的主机组 (当前组的主机数)[f:并发数]$

设置并发数: forks n 例:forks 10

切换组: cd 主机组/IP/all 例:cd web

列出当前组主机列表: list

列出所有内置命令: ? / help

root@all (2)[f:5]$ yum name=httpd state=latest
(下载安装 http 服务)

root@all (2)[f:5]$ service name=httpd state=starte
(启动 http 服务)

ansible-vault encrypt hello.yml (对剧本进行加密,加密不能执行)
ansible-vault decrypt hello.yml (解密)
view 查看
edit 编辑加密文件
rekey 修改加密口令
create hi.yml 创建新的加密文件

playbook 核心元素;(每天例行性做的事,可做个playbook)(小型自动化,200台以内主机)

ansible-playbook : 制作剧本;(建议生成文件用.yml做后缀)
(统一Tab / 空格 缩进)(YAML语法)

vim /data/hello.yml (创建剧本)

— (表示playbook的开始)
-hosts: all (执行的远程主机列表)
remote_user: root (表示用谁的身份执行)

tasks: (任务集)
– name: hello (任务名)
command: hostname (模板:要执行的任务)

ansible-playbook hello.yml (执行剧本)

Varniables 内置变量或自定义变量在playbook中调用

Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件

Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

tags 标签;指定执行某条任务,用于选择运行playbook中的部分代码。

例:
vim /data/all.yml


-hosts: all
remote_user: root

tasks:
– name: create new file
file: name=/data/newfile state=touch
– name: create new user
user: name=yang system=yes shell=/sbin/nologin
– name: install package
yum: name=httpd
– name: copy html
copy: src=/var/www/html/index.html dest=/var/www/html
– name: start service
service: name=httpd state=started enabled=yes

ansible-playbook -C /data/all.yml (测试执行,不真执行)

-C 检查执行,但不真执行
–list-hosts 列出运行任务的主机
–limit 主机列表 只针对主机列表中的主机执行
-v 显示过程 -vv -vvv 更详细

如果剧本中有错误,还希望继续执行,可以使用如下方式替代
tasks:
– name: run result
shell: /usr/bin/somecommand || /bin/true

示例:httpd.yml (安装;复制推送;开启)

– hosts: all
remote_user: root

tasks:
– name: Install httpd
yum: name=httpd state=present
– name: Install configure file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/
– name: start service
service: name=httpd state=started enabled=yes

handlers 和 notify 结合触发条件;

handlers: 用于当关注的模板发生变化时,才会执行操作;

notify: 这个是跟在某个执行模板后的,与handlers成对儿;描述姓名相同;

示例:httpd.yml (安装;复制推送;开启)

– hosts: all
remote_user: root

tasks:
– name: Install httpd
yum: name=httpd state=present
– name: Install configure file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/
notify: restart service
– name: start service
service: name=httpd state=started enabled=yes

handlers:
– name: restart service
service: name=httpd state=restarted

(在执行完copy模板后,则会触发handlers,httpd服务重启)

tags : 标签 ,可挑着执行剧本中的模板;

例:
vim /data/all.yml

-hosts: all
remote_user: root

tasks:
– name: create new file
file: name=/data/newfile state=touch
tags: file
– name: create new user
user: name=yang system=yes shell=/sbin/nologin
tage: user
– name: install package
yum: name=httpd
tage: install
– name: copy html
copy: src=/var/www/html/index.html dest=/var/www/html
tage: copy
– name: start service
service: name=httpd state=started enabled=yes
tage: start

ansible-playbook all -t file,user /data/all.yml
(挑着剧本中的标签模板执行)

ansible-playbook 中变量使用; (可实现灵活管理)

变量名:仅能由字母、数字和下划线组成、且只能以字母开头;

变量优先级:命令行里的变量>playbook里的变量>清单中的变量;

1、在/etc/ansible/hosts中定义

给单个IP地址定义变量 :后面加变量 172.20.11.111 name=file

给[server]主机组定义变量:在IP最下面添加 [server:vars]
file=abc
app=httpd

2、ansible setup facts 远程主机的所有变量都可直接调用

变量调用方式:
通过{{ variable_name }} 调用变量,且变量名前后必须有空格;
有时用 “{{ variable_name }}”才生效

ansible-playbook –e 选项指定

示例:
vim var.yml

– hosts: all
remote_user: root

tasks:
– name: install package
yum: name={{ app }} state=latest
– name: create log file
file: name=/data/{{ filename }}.log state=touch owner=zhang

执行:ansible-playbook -e app=httpd filename=file var.yml

2018/05/30

模板 templates ; (推送配置文件)

作用:将服务配置文件cp到/etc/ansible/template目录下,改名为xxxx.conf.j2;
修改.j2配置文件,然后在用playbook推送到各个主机;

(只能放在ansible-playbook 中使用)

Jinja2语言,使用字面量,有下面形式:
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false
算术运算:+, -, *, /, //(整除), %(取余), **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and, or, not
流表达式:For If When

templates功能:根据模块文件动态生成对应的配置文件;

templates文件必须存放在templates目录下,且后缀为.j2;

ansible-playbook以.yml结尾的文件需和templates目录平级。
(平级是指同在一级目录下,或二级目录下)

在ansible目录下创建:template 目录;

例: 将nginx配置文件推送到各个主机;
(由于nginx端口号和httpd端口号相同80;所以端口号改为81)

yum install nginx (epel源)
将nginx配置文件复制到template目录下,改名为nginx.conf.j2
cp /etc/nginx/nginx.conf /etc/ansible/template/nginx.conf.j2

cd /etc/ansible/
vim testtempl.yml


– hosts: all
remote_user: root
vars:
– http_port: 81

tasks:
– name: install package
yum: name=nginx
– name: copy template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart service
– name: start service
service: name=nginx state=started enabled=yes

handlers:
– name: restart service
service: name=nginx state=restarted

when: 判断条件;
哪个条件满足执行哪个模块;在模板下面跟when模板可生成判断条件;
when: 跟判断条件;

例:判断版本为6则推送nginx6配置文件;为7则推送nginx7配置文件;
vim testtempl.yml


– hosts: all
remote_user: root
vars:
– http_port: 81

tasks:
– name: install package
yum: name=nginx
– name: copy template for centos7
template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == “7”
notify: restart service
– name: copy template for centos6
template: src=nginx6.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == “6”
notify: restart service
– name: start service
service: name=nginx state=started enabled=yes

handlers:
– name: restart service
service: name=nginx state=restarted

迭代:with_items ;(需要重复性执行任务时)

例: 将多个文件推送到主机;下载多个服务;
vim copy.yml


– hosts: all
remote_user: root

tasks:
– name: copy some files
copy: src=/data/{{ item }} dest=/etc/{{ item }}
with_items:
– file1
– file2
– file3
– name: install some packages
yum: name={{ item }}
with_items
– httpd
– htop
– nginx

迭代 嵌套 子变量:

– 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’ }

Playbook中template for if ; (循环,判断条件)

例:将文件循环复制到主机;

vim forcopy.yml

– hosts: all
remote_user: root
vars:
ports:
– 81
– 82
– 83

tasks:
– name: copy conf
template: src=for1.conf.j2 dest=/data/for1.conf

调用循环文件模板: vim for1.conf.j2

{% for port in ports %}
server{
listen {{ port }}
}
{% endfor %}

roles(角色): 适合大型自动化,多台主机;复杂场景;

按一定的逻辑关系,存放到目录下,一一执行;
把一个playbook文件拆开放,灵活执行;

在/etc/ansible/roles 下创建各自的目录;(角色集合)

如:mkdir -pv roles/{httpd,nginx,mysql}

目录结构:(在各自角色目录下创建)
tasks/ (定义task,role的基本元素,至少应该包含一个名为main(主要).yml的文件)

files/ (存放copy或script模板调用的文件)

templates/(template模块查找所需要模板文件的目)

handlers/ (至少应该包含一个名为main.yml的文件)

vars/ (定义变量,至少应该包含一个名为main.yml的文件)
default/ (设定默认变量时使用此目录中的main.yml文件)
meta/ (定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件)

生成目录结构:
/etc/ansible/roles :
|
|___httpd
| |___tasks/
| |___files/
| |___templates/
| |___handlers/
| |___vars/
|
|___nginx
|___tasks/
|___files/
|___templates/
|___handlers/
|___vars/

创建role的步骤 :
(1) 创建以roles命名的目录

(2) 在roles目录中分别创建以各角色名称命名的目录,如httpd等

(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、 templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;

(4) 在创建的每个目录中 创建任务文件;

(5) 在playbook文件中,调用各角色;

创建任务文件:
vim /tasks/zhang_role.yml

任务文件:- name:任务名
模板:执行任务内容

例:- name: create user
user: name=zhang uid=99 group=root system=yes shell=/sbin/nologin

roles的示例如下所示:(前三个是playbook文件)

ansible/
site.yml
webservers.yml
dbservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/

playbook调用角色:
(在ansible目录下创建playbook文件,和roles目录同级)

vim /etc/ansible/httpd_role.yml

– hosts: all
remote_user: root
roles:
– role: httpd (创建的角色文件名)

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100810

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code