ansible剧本模板功能以及剧本整合

01课程概述介绍说明

1 ansible剧本编写特殊方法
2 ansible 剧本整合配置说明
3 ansible 软件总结梳理

02课程知识回顾说明

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种设置方法
在剧本中设置注册信息(显示执行过程以及返回结果)
ansible剧本模板功能以及剧本整合_第1张图片
在剧本中设置判断信息(当满足when的条件时就执行when上的任务—一对一,一个when对应一个任务)
ansible剧本模板功能以及剧本整合_第2张图片
ansible剧本模板功能以及剧本整合_第3张图片

在剧本中设置循环信息 (属于在剧本中再批量的编写东西)
ansible剧本模板功能以及剧本整合_第4张图片

在剧本中设置忽略错误信息(他的作用就是解决某些模块不具有幂等性的,如果没有创建,他还是会创建文件,执行那个模块的作用。)

在使用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
}

ansible多个剧本如何进行整合

方式一: 目前主流简单整合剧本

单个剧本

[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"

ansible剧本模板功能以及剧本整合_第5张图片

你可能感兴趣的:(ansible)