• ansible实践02ansible高级用法playbook介绍和使用


    1. ansible核心组件Playbook

    1)playbook前言

        Playbook:使用yaml格式进行表示。用来描述对应的远程主机需要执行的任务的一种表达方法。

    2)了解YAML

        YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。

        

    3)YAML语法格式

    基本数据结构:
    标量,数组(清单),关联数组。
    1.playbook核心元素:
    Hosts:主机(关联到的主机,由谁来唱这出戏)
    Tasks:任务列表(要唱哪些戏)
    Variables:(有些数据变量需要重复使用)
    Templates:包含了模板语法的文本文件。
    Handlers:由特定条件触发的任务。

    Roles

    2. Playbook基础组件

    Hosts:运行指定任务的目标主机
    remote_user:在远程主机上执行任务的用户
    sudo_user:如果切换用户,sudo到哪个用户执行
    tasks:任务列表
    模块,模块参数
    格式:
    1)action: module arguments
    2) module: arguments

    3. playbook运行方法

    a. playbook测试

    ansible-playbook --check
    只检测可能会发生的改变,但不真正执行此操作。

    ansible-playbook --list-hosts
    列出运行任务的主机

    b. 正式执行playbook

    handlers:任务,在特定条件下触发。
    notify: handler task name,接收到其它任务的通知时被触发。

    4. playbook实例

    实例1-安装nginx,启动nginx

    需要注意,接下来的实例都是以此实例为基础进行测试和修改。

    [root@elk01 playbooks]# cat playbook01.yaml
    - hosts: test03
    remote_user: root
    tasks:
    - name: install nginx
    yum: name=nginx state=installed
    - name: start nginx
    service: name=nginx state=started

    检查是否有语法错误:
    ansible-playbook --syntax-check playbook01.yaml

    查看执行任务的主机列表和具体执行哪些任务
    ansible-playbook --list-hosts --list-tasks playbook01.yaml


    预测试,不会改变目标主机的任何设置。
    ansible-playbook -C playbook01.yaml

    执行playbook
    ansible-playbook playbook01.yaml

    实例2-批量修改nginx配置文件,拷贝配置文件到远程主机,触发执行对应任务加载配置

    [root@elk01 playbooks]# cat playbook01-20220329bak.yaml
    - hosts: test03
    remote_user: root
    tasks:
    - name: install nginx
    yum: name=nginx state=installed
    - name: copy nginx configue file
    copy: src=/playbooks/nginx.conf dest=/etc/nginx/nginx.conf
    notify: restart nginx
    - name: start nginx
    service: name=nginx state=started
    handlers:
    - name: restart nginx
    service: name=nginx state=restarted

    实例3-批量修改nginx配置文件,然后只拷贝配置文件到远程主机,不做其他操作

    方法:加标签,tags, -t对应指定标签。

    [root@elk01 playbooks]# cat playbook01-20220329bak02tags.yaml
    - hosts: test03
    remote_user: root
    tasks:
    - name: install nginx
    yum: name=nginx state=installed
    - name: copy nginx configue file
    copy: src=/playbooks/nginx.conf dest=/etc/nginx/nginx.conf
    notify: restart nginx
    tags: configfile
    - name: start nginx
    service: name=nginx state=started
    handlers:
    - name: restart nginx
    service: name=nginx state=restarted

    [root@elk01 playbooks]# ansible-playbook -t configfile playbook01.yaml

    实例4-批量修改nginx配置文件,拷贝配置文件到远程主机,只执行指定配置标签的任务

    先在本地修改nginx,然后执行,这样安装和启动任务等其他任务就不会执行,只执行对应标签的任务。

    [root@elk01 playbooks]# cat playbook01.yaml
    - hosts: test03
    remote_user: root
    tasks:
    - name: install nginx
    yum: name=nginx state=installed
    - name: copy nginx configue file
    copy: src=/playbooks/nginx.conf dest=/etc/nginx/nginx.conf
    notify: restart nginx
    tags: configfile
    - name: start nginx
    service: name=nginx state=started
    handlers:
    - name: restart nginx
    service: name=nginx state=restarted


    [root@elk01 playbooks]# ansible-playbook -t configfile playbook01.yaml

    5. playbook tasks其它高级使用方式

    1)when条件测试

    when语句:在task中使用,jinja2语法格式。

    when条件测试简单示例01如下:

    tasks:
    - name: install conf file to centos7
    template: src=files/nginx.conf.c7.j2
    when: ansible_distribution_major_version =="7"
    - name: install conf file to centos6
    template: src=files/nginx.conf.c6.j2
    when: ansible_distribution_major_version == "6"

    when条件测试简单示例02如下:

    - hosts: test03
    remote_user: root
    tasks:
    - name: install httpd
    yum: name=httpd state=latest
    when: ansible_os_family == "RedHat"
    - name: install apache2
    apt: name=apache2 state=latest
    when: ansible_os_family == "Debian"

    2)迭代

    循环:迭代,需要重复执行任务。

    比如:安装部署LNMP,即nginx,mysql-server,php等,如果只安装这3个程序包,其实就是3个任务,那这样的话,本质就是任务一样,只是安装包不同而已,所以这个时候,playbook tasks支持迭代,有迭代这个功能,可以使用条件判断,就可以很好解决task重复问题。

    对迭代项的引用,固定变量名为"item",而后,要在task中使用with_items给定要迭代的元素列表;
    列表方法:
    字符串
    字典

    列表:
    - name: install some packages
    yum: name={{ item }} state=present
    with_items:
    - nginx
    - memcached
    - php-fpm

    字典:
    - name: add some groups
    group: name={{ item }} state=present
    with_items:
    - group11
    - group12
    - group13
    - name: add some users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - { name: 'user11',group: 'group11' }
    - { name: 'user12',group: 'group12' }
    - { name: 'user13',group: 'group13' }

    循环,迭代简单实例(列表)01:
    - hosts: test03
    remote_user: root
    tasks:
    - name: install {{ item }} package
    yum: name={{ item }} state=latest
    with_items:
    - nginx
    - tomcat
    - mariadb-server
    - redis


    循环,迭代简单实例(列表)02:安装tomcat
    - hosts: test03
    remote_user: root
    tasks:
    - name: install {{ item }} package
    yum: name={{ item }} state=latest
    with_items:
    - tomcat
    - tomcat-webapps
    - tomcat-admin-webapps


    循环,迭代简单实例(字典):暂略。

    6. roles(roles企业级应用)

            roles也是playbook核心元素之一。

    实例:3个节点,其中1个节点安装nginx,另外2个节点安装tomcat;tomcat用于web应用服务,nginx作为反向代理,代理后端2个tomcat。

    3个节点规划如下:

    10.96.211.102(nginx,其反向代理后端两个tomcat)
    10.96.211.103(tomcat)
    10.96.211.104(tomcat)

    ansible roles安装如上三个节点nginx,tomcat步骤如下:

    [root@elk01 ~]# ansible all --list-hosts
    hosts (3):
    10.96.211.102
    10.96.211.103
    10.96.211.104

    [root@elk01 ~]# ansible lb --list-hosts
    hosts (1):
    10.96.211.102

    [root@elk01 ~]# ansible web --list-hosts

    hosts (2):
    10.96.211.103
    10.96.211.104

    创建nginx roles


    步骤 1):创建nginx和tomcat 两个roles角色目录
    [root@elk01 ansible]# pwd
    /etc/ansible


    [root@elk01 ansible]# mkdir -pv roles/{nginx,tomcat}/{files,templates,tasks,handlers,vars,meta,default}

    步骤 2):先开发Nginx roles角色目录
    [root@elk01 nginx]# pwd
    /etc/ansible/roles/nginx

    nginx tasks:
    [root@elk01 nginx]# cat tasks/main.yml
    - name: install nginx
    yum: name=nginx state=latest
    when: ansible_os_family == "RedHat"
    - name: install conf
    copy: src=lb.conf dest=/etc/nginx/conf.d/
    tags: conf
    notify: restart nginx
    - name: start nginx
    service: name=nginx state=started enabled=yes

    nginx handlers:
    [root@elk01 nginx]# cat handlers/main.yml
    - name: restart nginx
    service: name=nginx state=restarted

    步骤 3):提供nginx需要复制的文件:
    [root@elk01 nginx]# cat files/lb.conf
    upstream web {
    server 10.96.211.103:8080;
    server 10.96.211.104:8080;

    }

    server {
    listen 80;
    server_name 10.96.211.102;
    location / {
    proxy_pass http://web;

    }


    }

    步骤 4):在任意目录下,创建nginx playbooks
    [root@elk01 ~]# mkdir playbooks

    [root@elk01 ~]# cd playbooks/
    [root@elk01 playbooks]# pwd
    /root/playbooks

    步骤 5):编辑nginx playbooks
    [root@elk01 playbooks]# cat nt.yml
    - hosts: lb
    remote_user: root
    roles:
    - nginx

    步骤 6):预测试运行playbooks(安装NGINX):

    [root@elk01 playbooks]# pwd
    /root/playbooks
    [root@elk01 playbooks]# ansible-playbook -C nt.yml

    PLAY [lb] ***************************************************************************************************************************************************

    TASK [Gathering Facts] **************************************************************************************************************************************
    ok: [10.96.211.102]

    TASK [install nginx] ****************************************************************************************************************************************
    changed: [10.96.211.102]

    TASK [nginx : install conf] *********************************************************************************************************************************
    changed: [10.96.211.102]

    TASK [start nginx] ******************************************************************************************************************************************
    changed: [10.96.211.102]

    RUNNING HANDLER [restart nginx] *****************************************************************************************************************************
    changed: [10.96.211.102]

    PLAY RECAP **************************************************************************************************************************************************
    10.96.211.102 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

    创建tomcat roles


    步骤 1):设计/开发tomcat主机 roles角色

    [root@elk01 tomcat]# pwd
    /etc/ansible/roles/tomcat

    [root@elk01 tomcat]# ls
    default files handlers meta tasks templates vars

    定义tomcat tasks:
    [root@elk01 tomcat]# cat tasks/main.yml
    - name: install package
    yum: name={{ item }} state=latest
    with_items:
    - tomcat
    - tomcat-admin-webapps
    - tomcat-webapps
    - tomcat-docs-webapp
    when: ansible_os_family == "RedHat"
    - name: start tomcat
    service: name=tomcat state=started enabled=yes

    如果远程主机没有安装JDK,那么想要通过playbooks (roles)安装JDK,需要创建JDK roles角色,创建步骤如下:创建步骤类似如上nginx,tomcat roles角色创建!


    步骤 2):编辑tomcat playbooks:

    [root@elk01 playbooks]# pwd
    /root/playbooks
    [root@elk01 playbooks]# vim nt.yml
    You have new mail in /var/spool/mail/root
    [root@elk01 playbooks]# cat nt.yml
    - hosts: lb
    remote_user: root
    roles:
    - nginx

    - hosts: web
    remote_user: root
    roles:
    - tomcat

    步骤 3):预测试运行playbooks(安装NGINX和tomcat):

    [root@elk01 playbooks]# ansible-playbook -C nt.yml

    步骤 4):正式运行playbooks(安装NGINX和tomcat):

    [root@elk01 playbooks]# ansible-playbook  nt.yml

  • 相关阅读:
    Ios 从无到有项目 MVVM模式(两)
    国外论文搜索
    memcpy的使用方法总结
    简单工厂模式
    curl命令具体解释
    java.lang.Math中的基本方法
    海量数据处理面试题集锦
    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 文件夹
    TinyXml高速入门(一)
    Android SDK 2.2 离线安装
  • 原文地址:https://www.cnblogs.com/renyongbin/p/16072371.html
Copyright © 2020-2023  润新知