1 ansible剧本编写特殊方法
2 ansible 剧本整合配置说明
3 ansible 软件总结梳理
1 批量管理服务概述介绍
解决重复性运维工作 代码上线
批量管理主机工作
2 实现批量管理服务方式
ansible
3 ansible课程重点核心
ansible主机清单配置说明
ansible模块功能说明 10个常用模块
ansible 剧本编写说明
企业级自动化运维应用实践ansible
公司计划年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备。
公司要求各业务组对年底促销做准备,运维部要求所有业务组队年底大促销准备,运维部要求所有业务容量进行三倍的扩容并搭建多套环境可以提供开发和测试人员做测试,运维老大为了在年底有所表现,要求所有运维部门同学尽量实现
当接到这个任务时,有没有更快的解决方案?
4 ansible部署过程
利用yum 进行安装(epel源)
yum info ansible
yum install -y ansible (前提是需要优化好epel源)
采用编译安装方式进行安装
yum install -y python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar xf ansible-xxx.gz
cd ansible-x.x.x
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r example/* /etc/ansible
采用git方式进行安装
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
利用pip方式安装
yum install -y python-pip python-devel
yum install -y gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install --upgrade ansible
软件安装完毕,进行版本确认
5主机清单配置
方式一: 直接添加被管理主机地址或者域名信息
方式二:采用分组方式进行配置(子组配置方式)
方式三:采用变量配置方式
06ansible模块使用说明:
ansible 主机信息 -m 模块 -a 参数信息
ansible-doc -s 指定模块 获取模块帮助信息
ansible server -m ping -k
主机清单 指定ping模块 -k 提示输入yes(ssh服务远程连接是提示输入的yes)
07 ansible剧本编写说明:
剧本核心组成部分
hosts:主机信息
tasks:任务信息
剧本编写规范说明:
①剧本信息缩进说明 如使用空格进行缩进
②剧本信息字典说明 如何使用冒号进行编写key:value
③剧本信息列表说明 如何使用短横线进行列表编写 - hosts
08 ansible 剧本编写特殊方式
在剧本中设置变量信息 3种设置方法
在剧本中设置注册信息(显示执行过程以及返回结果)
在剧本中设置判断信息(当满足when的条件时就执行when上的任务—一对一,一个when对应一个任务)
在剧本中设置忽略错误信息(他的作用就是解决某些模块不具有幂等性的,如果没有创建,他还是会创建文件,执行那个模块的作用。)
在使用shell万能模块时是不具有一种特性的,这种特性称为幂等性
举例:touch 具有幂等性
mkdir 不具有幂等性
不具有幂等性的情况下一般是使用命令参数使命令具有幂等性
mkdir -p
ansible在剧本中执行任务时是采用串行方式,任务1出现错误时,不会再执行任务2
但是在被管理主机端,执行任务时是采用并行方式执行的,多个主机一起执行任务1
[root@ansible playboook]# cat test_剧本忽略功能.yaml
- hosts: server
tasks:
- name: create user
shell: useradd rsync -s /sbin/nologin -M
ignore_errors: yes
- name: create backup dir
shell: mkdir /backup
ignore_errors: yes
- name: chown backup dir
shell: chown root.root /backup
在剧本中设置标签信息(用于测试剧本,某个任务有问题时,只执行这个任务,不执行其他确认没有问题的地方,节省时间)
[root@ansible playboook]# cat test_剧本标签功能.yaml
- hosts: all
tasks:
- name: create dir
file: path=/oldboy01 state=directory
- name: create file
file: path=/oldboy01/oldboy.txt state=touch
- name: chmod file
file: path=/oldboy02/oldboy.txt mode=600
tags: t1-chmod
测试剧本:是有问题的 file: path=/oldboy02/oldboy.txt mode=600
执行标签的地方
ansible-playbook -t t1-chmod test_剧本标签功能.yaml
跳过指定标签的地方
ansible-playbook --skip-tags t1-chmod test_剧本标签功能.yaml
注意:标签的名字是不可以重复的,在同一个剧本中。
加快剧本执行效率的剧本功能
gather_facts: no 获取主机实际情况信息 比如:when ansible_ipv4 == 10.0.0.41
[root@ansible playboook]# cat test_剧本收集信息.yaml
- hosts: all
gather_facts: no
tasks:
- name: copy file
copy: src=/etc/hosts dest=/tmp/
获取执行剧本的时间 [root@ansible playboook]# time ansible-playbook test_剧本收集信息.yaml
这个复制的模块是将:管理端的/etc/hosts文件复制到被管理主机端的/tmp目录下。
[root@ansible playboook]# cat test_剧本收集信息.yaml
- hosts: all
gather_facts: yes
tasks:
- name: copy file
copy: src=/etc/hosts dest=/tmp/
when: ansible_hostname == "web01"
当需要进行判断时,这个收集模块一定要开启,否则会报错,因为没有收集到这些信息,不知道该根据什么进行判断
在剧本中设置触发信息
[root@ansible playboook]# cat test_剧本触发功能.yaml
- hosts: all
tasks:
- name: create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: copy file
copy: src=./rsyncd.conf dest=/etc/
- name: create dir
file: path=/backup state=directory owner=rsync group=rsync
- name: boot server
service: name=rsyncd state=started
因为这里写的是开启,不是重启,所以你的配置文件修改以后,重新传输过去,但是服务端口还是没变,所以就用到了触发功能。
[root@ansible playboook]# cat test_剧本触发功能.yaml
- hosts: all
tasks:
- name: create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: copy file
copy: src=./rsyncd.conf dest=/etc/ ① 判断任务信息是否发生变化(黄色字体判断)
notify: restart rysnc server ② 进行触发器通知过程
- name: create dir
file: path=/backup state=directory owner=rsync group=rsync
- name: boot server
service: name=rsyncd state=started
handlers:
- name: restart rysnc server ③ 指定触发器收到通知信息
service: name=rsyncd state=restarted ④完成相应触发操作
通过修改配置文件中的端口号来进行修改服务的启动端口,再次使用ansible进行配置时会触发重启服务的任务,如果没有修改配置文件,则不会进行触发启动服务的任务。
[root@ansible playboook]# cat rsyncd.conf
#rsync_config
#created by HQ at 2017
##rsyncd.conf start##
uid = rsync
gid = rsync
port = 870
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = “backup dir by oldboy”
path = /backup
查看模块帮助信息
[root@ansible playboook]# ansible-doc -s user
这里我的ansible不知道为什么和老何的不一样。
在剧本配置jinja模板文件功能
方式一:简单配置模板文件
配置模板文件的作用:
在配置文件中设置变量,而决定变量是什么的地方为剧本,剧本里面可以给变量赋值。
模板文件
[root@ansible playboook]# cat test_剧本模本文件.yaml
- hosts: all
vars: 定义变量
ports: 878 -- 赋值的地方 此处的ports是和配置文件中的变量一致的。
tasks:
- name: create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: copy file
template: src=./rsyncd.conf.jinja dest=/etc/rsyncd.conf template是将变量赋值进行识别 他三个是配套使用的
notify: restart rysnc server
- name: create dir
file: path=/backup state=directory owner=rsync group=rsync
- name: boot server
service: name=rsyncd state=started
handlers:
- name: restart rysnc server
service: name=rsyncd state=restarted
配置文件(模板配置文件的命名规则就是jinja2 不过你传输之前是这个名字,传输之后可以不是,比如这里的 rsyncd.conf.jinja2 传输过去后就是rsyncd.conf)
[root@ansible playboook]# cat rsyncd.conf.jinja
#rsync_config
#created by HQ at 2017
##rsyncd.conf start##
uid = rsync
gid = rsync
port = {
{
ports }} --定义变量
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = “backup dir by oldboy”
path = /backup
注意一点:触发功能仍可以起作用。 虽然这样来看,配置文件是没有改变的,但是变量在赋值以后,template时是修改了的,所以也会触发重启功能。
方式二: 编写一个重复的段落内容信息
剧本文件
[root@ansible playboook]# cat test_剧本模本文件2.yaml
- hosts: all
vars:
port:
- 80
- 81
- 82
tasks:
- name: copy file
template: src=./test.j2 dest=/etc/server.conf
模板文件
[root@ansible playboook]# cat test.j2
{
% for info in port %}
server {
listen {
{
info }}
}
{
% endfor %}
[root@ansible playboook]#
传输过去后的文件为
[root@web01 tmp]# cat /etc/server.conf
server {
listen 80
}
server {
listen 81
}
server {
listen 82
}
逻辑过程说明:
ansible-playbook test_剧本模本文件2.yaml ①执行剧本文件
加载剧本文件中模板文件 ② 识别模板文件( 模本文件的名字也可以不叫jinja2 随意也行,原因可能是因为template模块可以识别模板文件中的src =源文件来识别变量。)
根据模板文件信息进行循环 ③识别循环变量信息
将模板文件识别生成信息追加到指定文件中 ④ 在目标被管理主机上生成指定配置文件
示例说明:
// temnginx.yml
- hosts: testweb
remote_user: root
vars:
nginx_vhosts:
- listen: 8080 —此处是使用字典的方式
// templates/nginx.conf.j2
{% for vhost in nginx_vhosts %}
server {
listen { { vhost.listen }} 调用vhost变量中的listen 变量
}
{% endfor %}
生成的结果:
server {
listen 8080
}
练习题: 如何编写一个模板文件,生成一个配置文件
server {
listen 80
root /oldboy01
server_name www.oldboy.com
}
server {
listen 81
root /oldboy02
server_name bbs.oldboy.com
}
server {
listen 82
root /oldboy03
server_name blog.oldboy.com
}
方式一: 目前主流简单整合剧本
单个剧本
[root@ansible playboook]# cat test{01..04}.yaml
- hosts: all
tasks:
- name: create user
user: name=rsync create_home=no shell=/sbin/nologin
- hosts: all
tasks:
- name: copy file
copy: src=./rsyncd.conf dest=/etc/
- hosts: all
tasks:
- name: create dir
file: path=/backup state=directory owner=rsync group=rsync
- hosts: all
tasks:
- name: boot server
service: name=rsyncd state=started
剧本整合
[root@ansible playboook]# cat test00.yaml
- import_playbook: test01.yaml
- import_playbook: test02.yaml
- import_playbook: test03.yaml
- import_playbook: test04.yaml
这种方式有问题:
问题一: 不方便识别管理主机 (test00.yaml中看不到管理的主机是哪个)
问题二: 数据信息目录结构不统一 (不利于跨企业进行使用,每个企业的目录结构不同)
方式二: 利用角色方式进行执行 标准汇总剧本实现自动化功能
(这种方式相较于第一种方式好处是:直接在roles目录中添加子目录就可以了。当然如果B企业中已经有了,你的模板也是可以使用的,因为这是一种规范,子目录一共就这么几个。)
第一个历程: 创建不同角色目录
mkdir roles/rsync
第二个历程: 在角色目录中创建对应子目录
vars: 在此目录中可以设置变量文件信息
tasks 在此目录中编写剧本任务信息
templates 在此目录中定义jinja2模板文件信息
handlers 在此目录中定义触发器功能信息
files 在此目录中保存所有要分发配置文件信息
[root@m01 roles]# tree rsync/
rsync/
├── files ①
├── handlers ③
├── tasks ②
├── templates
└── vars
file: 所有配置文件放入file目录中
部署rsync服务:
1.rsync程序配置文件 rsync.conf
2.rsync密码文件 rsync.password.server rsync.password.client
(此处说明 rsync服务的密码文件 可以是server端和client端不同 )
部署rsync服务的任务:
vim main.yaml 这个是固定的,只能叫这个名字
第三个历程: 将多个角色信息进行汇总
将多个角色信息进行汇总
第四个历程: 测试角色配置
ansible-playbook /etc/ansible/roles/site.yaml -i /etc/ansible/roles/hosts
-i 参数 指定主机清单文件
[root@ansible ansible]# tree roles/
roles/
├── hosts 指定主机清单
├── rsync 创建目录
│ ├── files 配置文件目录
│ │ ├── rsyncd.conf 配置文件
│ │ ├── rsync.password.client 客户端密码文件
│ │ └── rsync.password.server 服务端密码文件
│ ├── handlers 触发目录
│ │ └── main.yaml 触发文件(指定的命名,不可以修改)
│ ├── tasks 任务目录
│ │ └── main.yaml 任务剧本
│ ├── templates 模板目录
│ │ └── rsyncd.conf.j2 模板文件
│ └── vars 变量目录
│ └── main.yaml 变量文件
└── site.yaml 总的剧本,执行时就执行这个剧本
主机清单文件
[root@ansible roles]# cat hosts
[rsync]
10.0.0.8
总的剧本(指定执行那个目录比如这儿的rsync)
[root@ansible roles]# cat site.yaml
- hosts: rsync
roles:
- rsync
rsyncd.conf配置文件
[root@ansible files]# cat rsyncd.conf
#rsync_config
#created by HQ at 2017
##rsyncd.conf start##
uid = rsync
gid = rsync
port = 877
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = “backup dir by oldboy”
path = /backup
客户端以及服务端的密码文件
[root@ansible files]# cat rsync.password.client
oldboy123
[root@ansible files]# cat rsync.password.server
rsync_backup:oldboy123
触发任务文件(指定触发文件)
[root@ansible handlers]# cat main.yaml
- name: restart rsync server
service: name=rsyncd state=restarted
任务剧本
[root@ansible tasks]# cat main.yaml
- name: install software
yum: name=rsync state=installed
- name: copy file
copy: src={
{
item.src }} dest={
{
item.dest }} mode={
{
item.mode }}
with_items:
- {
src: 'rsyncd.conf', dest: '/etc/', mode: '644'}
- {
src: 'rsync.password.server', dest: '/etc/', mode: '600'}
when: ansible_hostname == "web01"
notify: restart rsync server
- name: create user
user: name=rsync create_home=no shell=/sbin/nologin
when: ansible_hostname == "web01"
- name: create backup dir
file: path=/backup state=directory owner=rsync group=rsync
when: ansible_hostname == "web01"
- name: boot server
service: name=rsyncd state=started
when: ansible_hostname == "web01"
- name: copy password file
copy: src=rsync.password.client dest=/etc/ mode=600
when: ansible_hostname != "web01"
模板文件
[root@ansible templates]# cat rsyncd.conf.j2
#rsync_config
#created by HQ at 2017
##rsyncd.conf start##
uid = rsync
gid = rsync
port = {
{
ports_info }} 这是设置的变量
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = “backup dir by oldboy”
path = /backup
变量文件
[root@ansible vars]# cat main.yaml
ports_info: 999
注意:这里的是测试变量的使用,但是tasks的剧本还没修改,修改后使用
修改后的tasks:
[root@ansible tasks]# pwd
/etc/ansible/roles/rsync/tasks
[root@ansible tasks]# cat main.yaml
# server tasks
- name: install software
yum: name=rsync state=installed
- name: copy conf file
template: src=rsyncd.conf.j2 dest=/etc/rsyncd.conf
when: ansible_hostname == "web01"
notify: restart rsync server
- name: copy password file
copy: src={
{
item.src }} dest={
{
item.dest }} mode={
{
item.mode }}
with_items:
- {
src: 'rsync.password.server', dest: '/etc/', mode: '600'}
when: ansible_hostname == "web01"
- name: create user
user: name=rsync create_home=no shell=/sbin/nologin
when: ansible_hostname == "web01"
- name: create backup dir
file: path=/backup state=directory owner=rsync group=rsync
when: ansible_hostname == "web01"
- name: boot server
service: name=rsyncd state=started
when: ansible_hostname == "web01"
- name: copy password file
copy: src=rsync.password.client dest=/etc/ mode=600
when: ansible_hostname != "web01"