Ansible自动化部署之Play book的使用

一、Ansible Play book 的使用

1、Playbook的核心元素

2、Play books简介

3、Play book的基础

(1)主机与用户

(2)tasks任务列表

(3)task定义示例

(4)Play book使用示例

4、Play book变量的使用

(1)变量的定义示例

5、Play book中notifyh和handlers的使用.

示例:触发

6、Play book中tags的使用

7、tepmplates 模板的使用

jinja2语言

示例:模板安装nginx

when条件判断

迭代with_items

一、AnsiblePlay book 的使用

1、Playbook的核心元素

Hosts:               主机,部署目标

Tasks:               任务,ansible,执行目的

Varlables:         变量

Templates:       包含了模板语法的文本文件;

Handlers:                   有特定条件触发的任务

Roles :              角色  (特别介绍)

2、Play books简介

简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.

Playbooks可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.

Playbooks 的格式是YAML(详见:YAML 语法),语法做到最小化,意在避免 playbooks 成为一种编程语言或是脚本,但它也并不是一个配置模型或过程的模型.

playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表.

在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务是一个对 ansible 模块的调用。

3、Play book的基础

(1)主机与用户

Hosts:运行指定任务的目标主机 ()可以是一个或多个冒号分隔的主机组)

remoute_user: 在远程主机上执行任务的用户;

(2)tasks任务列表

每个play包含了一个task列表(任务列表),每一个task在其对应的所有主机上(通过host parttern匹配到的所有主机)执行完毕之后才执行下一task。注意:一个paly中的所有hosts 都会获取相同的任务指令,也就是将一组选出的hosts映射到task上,所有主机执行task任务中的命令。

每一个task的目标在于执行一个moudle,通常是带有特定的参数来执行,在参数中可以使用变量(variables).

modules是具有“幂等”性的,意思是如果在执行module时此前已经执行过一次,目标主机不会作出任何改变,假设新一次的执行有所改动,那moudle只会改变必要的已经改变的地方,原有的已经执行过的结果不会发生任何改变。

每一个task必须有一个名称name,这样在运行play book时,从其输出的任务执行信息中可以很好的判断属于哪个task,如果没有定义name, action的值将会用作输出信息中标记的特定的taask。

(3)task定义示例

示例1:

下面是一种基本的task定义,server module 使用key=value格式的参数,这也是大多数moudle使用的参数格式:

tasks:

- name: apache start

service:name=httpd  state=started

示例2:

注意:shell和command模块后面直接跟命令,而非key=value类的参数列表

tasks:

- name: disable selunx

command: /sbin/setenforce 0

(4)Play book使用示例

示例1:添加用户

   [[email protected]_1 yaml]# cat user.yaml
    ---
     - hosts: all
      remote_user: root
      tasks:
      - name: create user1
        user: name=user1 system=true uid=307
      - name: create user2
        user: name=user1 system=true uid=308
    [[email protected]_1 yaml]# ansible-playbook user.yaml 
    #可添加—check 选项执行前检查

 4、Play book变量的使用

(1)facts: 可直接调用

(2)ansible-playbook 命令的命令行中的自定义变量

-e EXTRA_VARS, --extra-vars=EXTRA_VARS  #命令行中定义变量传递至yaml文件。

(3)通过roles传递变量

(4)Host Inventory

(a)向不同的主机传递不同的变量;

IP/HOSTANME varable=value var2=value2

在hosts 组ip后添加变量

(b)向组中的主机传递相同的变量

[group:var]

arable=value

注意:Inventory参数:

用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量。                                 ansible_ssh_host

ansible_ssh_user

ansible_ssh_port

ansible_ssh_pass

ansible_sudo_pass

….

查看远程主机的全部系统信息

   ansible all -m setup  #收集到的远程主机的变量

(1)变量的定义示例:

     变量定义位置 /etc/ansible/hosts
     普通变量
      [web]
       172.16.250.240  http_port=80
       172.16.252.18   http_port=8080  
     组变量
       [web:var1]
        http_port=80
       [web]
        172.16.250.240  
        172.16.252.18    
      在playbook中定义变量的方法
                Vars:
                - var1:value1
                - var2:value2
        命令行指定变量
       nsible-playbook -e  调用

示例1:hosts定义变量使用方法

[[email protected]_1 ~]#vim /etc/ansible/hosts
[web]
172.16.250.90 hname=node1
[[email protected]_1 ~]# cd /apps/yaml/
[[email protected]_1 yaml]# vim hosname.yml
---
- hosts: web
  remote_user: root
  tasks:
  - name: sethostname
    hostname:name={{ hname }}
[[email protected]_1 yaml]# ansible-playbook  hosname.yml

示例2:在playbook中定义变量的方法

[[email protected]_1yaml]# vim user1.yml
---
- hosts: web
 remote_user: root
 vars:  #定义变量
 - username: testuser1   #变量列表
 - groupname: testgroup1
 tasks:
 - name: crete group
   group: name={{ groupname }} state=present
 - name: crate user
   user: name={{ username }} state=present                                                                                                                                                           
[[email protected]_1 yaml]#ansible-playbook  user1.yml

示例3:命令行参数传递

利用命令行定义变量传递参数至剧本安装memcached。
[[email protected]_1 yaml]#vim forth.yml
---
- hosts: web
 remote_user: root
 tasks:
 - name: install $pkname
yum: name={{pkname }} state=present       
[[email protected]_1yaml]# ansible-playbook -e pkname=memcached forth.yml

5、Play book中notifyh和handlers的使用

notify这个action可用于每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成之后一次性地执行指定操作。

在notify中列出的操作称为handler,即notify中调用handler中定义的操作。

handler也是也写task的列表,通过名字来引用,他们和一般的task没有什么区别。

handler是由通知者进行notify,如果没有被notify,handler是不会执行的。

不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handler也只会被执行一次。

handlers最佳的应用场景是用来重启服务,或者触发系统重启操作的。除此之外很少会用到的。

示例:触发

 利用notify、handlers触发式重启服务。
[[email protected]_1yaml]# vim web-2.yml
---
- hosts: web
  remote_user: root
  tasks:
  - name: install httpdpackage
    yum: name=httpdstate=present
  - name: install configurefile
copy: src=/apps/work/files/httpd.confdest=/etc/httpd/conf/  
#该文件与目标主机文件不完全一致变回触发。
    notify: restart httpd
  - name: start httpd service
    service: name=httpdstate=started
  handlers:
  - name: restart httpd
service: name=httpd state=restarted
 [[email protected]_1 yaml]#ansible-playbook  web-2.yml

6、Play book中tags的使用

tags即标签,tags可以和一个play(就是很多个task)或者一个task进行捆绑。然后再执行play book时只需指定相应的tags即可仅执行与tags绑定的task。

示例:执行指定tags

[[email protected]_1yaml]# vim web-3.yml
---
- hosts: web
 remote_user: root
 tasks:
 - name: install httpd package
   yum: name=httpd state=present
 - name: install configure file
   copy: src=/apps/work/files/httpd.conf dest=/etc/httpd/conf/
   tags: instconf              #tags
 - name: start httpd service
   service: name=httpd state=started
 [[email protected]_1 yaml]# ansible-playbook -tinstconf  web-3.yml  
     #指定tags instconf 执行。
   ansible-playbookweb-3.yml --tags=" instconf "   
   执行此命令同样仅执行instconf 标签内容。

7、tepmplates 模板的使用

template是文本文件,嵌套有脚本(使用模板编程语言编写)的配置文件。

讲到template模板就不得不先介绍template使用语言 jinja2。

jinja2语言

Jinja2是基于python的模板引擎,功能比较类似于PHP的smarty,J2ee的Freemarker和velocity。它能完全支持    unicode,并具有集成的沙箱执行环境,应用广泛。

Jinja2 语言:

字面量:

字符串:使用单引号或双引号;

数字:整数,浮点数

列表:[item1,item2 …..]

元组:(item1item2…,)

字典:{key1:value,key2:value….}

布尔型: true/filase

算数运算:

+,- , * , / , // , % **

比较操作:

==, != , >=  ,<=

逻辑运算:

and,or, not,

流表达式

For、IF、when

示例:模板安装nginx

模板配置文件nginx.conf.j2
Worker_porcesses {{ ansible_precossor_vcpus }}  #注意空格哦。
此变量执行ansible all -m setup  (收集到的远程主机的变量) 即可查看到
Worker_porcesses {{ ansible_precossor_vcpus +1 }}
 此表达式也可。此处只为表示可支持算数运算。
 
[[email protected]_1 yaml]# vim nginx.yml
---
- hosts: web
 remote_user: root
 tasks:
 - name: install nginx
  yum: name=nginx state=present
 - name: install conf file
  template: src=/apps/work/files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx
  tags: instconf
 - name: start nginx service
  service: name=nginx state=started
 handlers:
 - name: restart nginx
    service:name=nginx state=restarted
[[email protected]_1 yaml]# ansible-playbook  nginx.yml

when条件判断

 when 语句:在task中使用。Jinja2的语法格式
tasks:
- name: install conf file to Centos7
  template:src=files/nginxconf.c7.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version==”7”
- name: install conf file to Centos6
  template:src=files/nginxconf.c6.j2 dest=/etc/nginx/nginx.conf
  when:ansible_distribution_major_version ==”6”
以上语法表示若查询远程主机系统为centos6则执行,install conf file to Centos6。
若为cenos7则执行install conf file to Centos7。

迭代with_items

循环迭代,需要重复执行的任务;对迭代项引用,固定变量名为item,而后在task中使用with_items给定迭代的元素列表;

列表方法:

字符串

字典

示例1:
字符串方式
  - name: install some package
   yum:name={{ item }}  state=present
     with_items:
   - nginx
     - memecached
     - php-fpm
示例2:
字典方式
    - name: add  some groups
    group: name={{ item }} state=present
    with_items:
    - group1
    - group2
    - group3
    - name: add some user
       user: name={{ item.name }} group={{item.group}} state=present
      with_items:
      - {name: ‘user1‘,group: ‘group1‘}
      - {name: ‘user2‘,group: ‘group2‘}
      - {name: ‘user3‘,group: ‘group3‘}

ansible的格式要求比较严格,因此在部署时一定要注意格式的书写。文中若有不当之处望见谅。各位可以在评论处留言支出不当之处。

时间: 2024-11-03 05:22:09

Ansible自动化部署之Play book的使用的相关文章

实战:ansible自动化部署nginx+keepalived+mysql负载均衡集群

一.目的 使用ansible自动化部署nginx+keepalived+mysql负载均衡集群. 二.拓扑规划 三.详细步骤 1.环境的搭建 (1).安装ansible,同时配置私钥免密码进行通信 [[email protected] ~]# ssh-keygen  -t rsa #-t表示使用的加密类型,其中rsa1表示version1版本,rsa.dsa.ecdsa的加密对于的是version2版本 Generating public/private rsa key pair. #这里询问你

Jenkins+Gitlab+Ansible自动化部署(六)

Pipeline Job实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs.com/zd520pyx1314/p/10249094.html) 环境准备 编写ansible playbook脚本实现Wordpress远程部署 将wordpress源码与playbook部署脚本提交到gitlab仓库 编写pipeline job脚本实现Jenkins流水线持续交付流程 Jen

项目部署与ansible自动化部署

目录 项目部署与ansible自动化部署 一.项目部署 二.ansible自动化部署(python自动化运维) 1.安装ansible 2.ansible例子 3.ansible自动化部署nginx 项目部署与ansible自动化部署 一.项目部署 # 1.将项目的压缩包拖入xshell # 2.从数据库中导出sql文件,拖入xshell # 3.启动数据库服务,进入mysql数据库 # 4.在Linux中建立数据库 mysql> create database bbs charset utf8

Ansible自动化部署k8s-1.16.0版集群

Ansible自动化部署k8s二进制集群 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新.Ansible适用于管理企业IT基础设施. 这里我通过Ansible来实现Kubernetes v1.16 高可用集群自动部署(离线版) (但是还是需要网络,因为这里需要去部署flannel,coredns,ingress,dashboard插件,需要拉取镜像 Ansible自动化部署k8s-1.16.0版集群介绍 使用ansible自动化部署k

Ansible自动化部署corosync+pacemaker高可用实现httpd

一.ansible简介 ansible是2012年出现的自动运维工具,基于python开发,集合了众多工具的优点,可以实现批量系统配置.批量程序部署.批量运行命令.批量配置文件修改等功能.最主要的是ansible是基于多模块工作的,而且ansible是无需客户端安装就可以基于ssh实现管理节点的,是轻量级的自动化运维工具,ansible是个框架,主要包括以下几个组件: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inventory:设置管理的

使用ansible自动化部署nfs+rsync+sersync+web01自动化挂载

第1章 思考 1.1如何一键使用ansible搭建 1.1.1第一步目标 首先我们要明确的是我们需要实现的是一键的自动化脚本,既执行一个脚本然后就自动化安装nfs+rsync+sersync,然后让web01自动挂载nfs共享目录, 1.1.2第二步关系明确及顺序 既然有目标了那么我们需要做的就是我们需要明白自动化安装的先后顺序. 既然我们是需要ansible才能自动化安装那么我们就需要先安装ansible 安装了ansible之后,既然我们想要挂载,那么我们就需要有nfs共享,和rsync备份

基于ansible自动化部署nginx+mysl+php分离来实现lnmp

实验说明: 服务角色 IP 系统 需安装 主控机 192.168.24.128 centos7 ansible A受控机 192.168.24.130 centos7 nginx B受控机 192.168.24.131 centos7 mysql C受控机 192.168.24.132 centos7 php-fpm 实验需求: 在主控机上使用自动化运维工具ansible在A受控机上安装nginx,在B受控机上安装mysql,在C受控机上安装php-fpm,实现lnmp构架 实验步骤 在主控机上

Ansible自动化部署之ROLES

一.ROLES 角色 1.目录层级结构 2.角色调用 3.层级结构展示 示例1:利用ansible角色安装nginx 示例2:变量调用 示例3:在playbook调用角色方法:传递变量给角色 示例4:条件测试角色调用 示例5:角色安装 示例6:角色变量调整memcached内存大小 一.ROLES 角色 对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web.db.ha 时或不同服务器组合不同的应用就需要写多个yml文件.很难实现灵活的调用.. roles 用于层次性.结构化地组织pla

ansible自动化部署zabbix客户端

本文主要介绍使用ansible playbook中roles,在不同os版本下批量部署zabbix客户端. 一.facts介绍 playbook的部分fetch信息 ansible版本2.2.1.0 使用setup模块获取 # ansible 192.168.1.12 -m setup "ansible_distribution": "CentOS",  "ansible_distribution_major_version": "6&