自动化运维Ansible实践(二)

上篇提到了ansible基本安装、配置及命令行使用,这篇分享下ansible的高级用法即playbook,在生产环境如果需要完成负责任务,如大批量服务安装配置等,可以采用playbook方式来完成,高效且易于维护。

第 1 章 Playbook基本使用

使用Playbook的好处
特点
? 易读的编排语言
? 适合配置管理和应用部署
? 非常适合部署复杂的工作
先来认识一下Playbook
自动部署Nginx

main.yml


  • hosts: webservers
    vars:
    hello: Ansible

    tasks:

    • name: Add repo
      yum_repository:
      name: nginx
      description: nginx repo
      baseurl: http://nginx.org/packages/centos/3/$basearch/
      gpgcheck: no
      enabled: 1
    • name: Install nginx
      yum:
      name: nginx
      state: latest
    • name: Copy nginx configuration file
      copy:
      src: ./site.conf
      dest: /etc/nginx/conf.d/site.conf
    • name: Start nginx
      service:
      name: nginx
      state: started
    • name: Create wwwroot directory
      file:
      dest: /var/www/html
      state: directory
    • name: Create test page index.html
      shell: echo "hello {{hello}}" > /var/www/html/index.html

site.conf

server {
listen 80;
server_name www.ctnrs.com;
location / {
root /var/www/html;
index index.html;
}
}

.YAML语法
? 缩进表示层级关系
? 不支持制表符“tab”缩进,使用空格缩进
? 通常开头缩进 2 个空格
? 字符后缩进 1 个空格,如冒号、逗号等
? “---” 表示YAML格式,一个文件的开始
? “#”注释
playbook帮助 ansible-playbook --help
在执行前可以先检查语法ansible-playbook nginx.yml --syntax-check
.Playbook文件结构

  • name: play1
    hosts: webservers
    remote_user: root
    vars:
    var_name: value
    tasks:

    • name: echo
      shell: "echo {{var_name}}"
  • name: play2
    hosts: webservers
    remote_user: root
    vars:
    var_name: value
    tasks:
    • name: echo
      shell: "echo {{var_name}}"

  • hosts: webservers
    remote_user: root
    vars:
    var_name: value
    tasks:
    • name: echo
      shell: "echo {{var_name}}"

.在变更时执行操作(handlers)
notify:在任务结束时触发
handlers:由特定条件触发Tasks

hosts: webservers
gather_facts: no

tasks:

  • name: Copy nginx configuration file
    copy:
    src: ./site.conf
    dest: /etc/nginx/conf.d/site.conf
    notify:

    • reload nginx ------》当配置文件改变时通知重启nginx服务

    handlers:

    • name: reload nginx
      service: name=nginx state=reloaded

.任务控制(tags)
在每一个任务中添加tags标签,可以根据指定的tags运行相应的任务。

  • hosts: webservers
    gather_facts: no
    vars:
    hello: Ansible

    tasks:

    • name: Add repo
      yum_repository:
      name: nginx
      description: nginx repo
      baseurl: http://nginx.org/packages/centos/2/$basearch/
      gpgcheck: no
      enabled: 1
    • name: Install nginx
      yum:
      name: nginx
      state: latest
      tags: install
    • name: Copy nginx configuration file
      copy:
      src: ./site.conf
      dest: /etc/nginx/conf.d/site.conf
      tags: congiuration
    • name: Start nginx
      service:
      name: nginx
      state: started
    • name: Create wwwroot directory
      file:
      dest: /var/www/html
      state: directory
    • name: Create test page index.html
      shell: echo "hello {{hello}}" > /var/www/html/index.html
      指定tags运行:
      [[email protected] ansible-playbook]# ansible-playbook nginx.yml --tags "congiuration"

PLAY [webservers] ***

TASK [Copy nginx configuration file] ****
ok: [192.128.132.12]
ok: [192.128.132.14]

PLAY RECAP **
192.128.132.14 : ok=1 changed=0 unreachable=0 failed=0
192.128.132.12 : ok=1 changed=0 unreachable=0 failed=0

.Playbook文件调试
语法检查:ansible-playbook main.yml --syntax-check

打印语句:

  • hosts: webservers
    tasks:

    • debug:
      msg: {{group_names}}
    • debug:
      msg: {{inventory_hostname}}
    • debug:
      msg: {{ansible_hostname}}

.案例:自动部署Tomcat

  • hosts: 192.128.132.12
    gather_facts: no
    vars:
    tomcat_version: 8.1.33
    tomcat_install_dir: /usr/local

    tasks:

    • name: Install jdk1.8
      yum: name=java-1.8.0-openjdk state=present
    • name: Download tomcat
      get_url: url=http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz dest=/tmp
    • name: Unarchive tomcat-{{ tomcat_version }}.tar.gz
      unarchive:
      src: /tmp/apache-tomcat-{{ tomcat_version }}.tar.gz
      dest: "{{ tomcat_install_dir }}"
      copy: no
    • name: Start tomcat
      shell: cd {{ tomcat_install_dir }} &&
      mv apache-tomcat-{{ tomcat_version }} tomcat8 &&
      cd tomcat8/bin && nohup ./startup.sh &

第 2 章 Playbook定义变量与使用

.命令行
.在Inventory中定义
.在Playbook中定义

在Playbook中定义变量



hosts: webservers
gather_facts: no
vars:
var_name: value
var_name: value
tasks:

  • name: hello
    shell: "echo {{var_name}}"

.在Role中定义
.注册变量(register)

注册变量


  • hosts: webservers
    gather_facts: no
    tasks:

    • name: Get date
      command: date +"%F_%T"
      register: date_output
    • name: Echo date_output
      command: touch /tmp/{{date_output.stdout}}

.系统信息变量(facts)

系统变量



hosts: webservers
tasks:

  • name: Get hostname
    debug: msg={{ansible_hostname}}

    第 3 章 Playbook文件复用

    .include & import 区别
    include(动态):在运行时导入
    ? --list-tags,--list-tasks不会显示到输出
    ? 不能使用notify触发来自include
    内处理程序名称(handlers)

import*(静态):在Playbook解析时预先导入
? 不能与循环一起使用
? 将变量用于目标文件或角色名称时,不能使用inventory(主机/主机组等)中的变量

import_playbook

includetasks & importtasks

4. 第 4 章 Playbook流程控制

条件

  • hosts: webservers

    tasks:

    • name: Host 192.168.132.16 run this task
      debug: msg="{{ansible_default_ipv4.address}}"
      when: ansible_default_ipv4.address == ‘192.168.132.16‘
      只执行该任务,跳过其他主机。

根据不同发行版安装apache服务

  • hosts: webservers

    tasks:

    • name: Update apache version - yum
      yum: name=httpd state=present
      when: ansible_pkg_mgr == ‘yum‘
      notify: restart httpd
    • name: Update apache version - apt
      apt: name=apache2 state=present update_cache=yes
      when: ansible_pkg_mgr == ‘apt‘
      notify: restart apache2

    handlers:

    • name: restart httpd
      service: name=httpd state=restared
      handlers:
    • name: restart apache2
      service: name=apache2 state=restared
      tasks:
  • name: "shut down CentOS 6 and Debian 7 systems"
    command: /sbin/shutdown -t now
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
    (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
    tasks:
    • name: "shut down CentOS 6 systems"
      command: /sbin/shutdown -t now
      when:

      • ansible_distribution == "CentOS"
      • ansible_distribution_major_version == "6"

循环

  • name: with_list
    debug:
    msg: "{{ item }}"
    with_list:

    • one
    • two
  • name: with_list -> loop
    debug:
    msg: "{{ item }}"
    loop:
    • one
    • two
  • name: with_items
    debug:
    msg: "{{ item }}"
    with_items: "{{ items }}"
  • name: with_items -> loop
    debug:
    msg: "{{ item }}"
    loop: "{{ items|flatten(levels=1) }}"
    创建用户:
  • hosts: webservers
    gather_facts: no
    tasks:
    • name: with_list
      user: name={{item}} state=present
      with_list:

      • test1
      • test2

        5. 第 5 章 Playbook模板(jinja2)

        5.1 .条件和循环

        test.yml


  • hosts: webservers
    vars:
    hello: Ansible

    tasks:

    • template: src=f.j2 dest=/tmp/f.j2

f.j2

{% set list=[‘one‘, ‘two‘, ‘three‘] %}

{% for i in list %}
{% if i == ‘two‘ %}
-> two
{% elif loop.index == 3 %}
-> 3
{% else %}
{{i}}
{% endif %}
{% endfor %}

{{ hello }}
{% set dict={‘zhangsan‘: ‘26‘, ‘lisi‘: ‘25‘} %}
{% for key, value in dict.iteritems() %}
{{key}} -> {{value}}
{% endfor %}

5.2 .案例:管理Nginx配置文件

main.yml


  • hosts: webservers
    gather_facts: no
    vars:
    http_port: 80
    server_name: www.ctnrs.com

    tasks:

    • name: Copy nginx configuration file
      template: src=site.conf.j2 dest=/etc/nginx/conf.d/www.ctnrs.com.conf
      notify: reload nginx

    handlers:

    • name: reload nginx
      service: name=nginx state=reloaded

site.conf.j2

{% set list=[10, 12, 13, 25, 31] %}
upstream {{server_name}} {
{% for i in list %}
server 192.168.1.{{i}}:80;
{% endfor %}
}
server {
listen {{ http_port }};
server_name {{ server_name }};

location / {
    proxy_pass http://{{server_name}};
} 

}

原文地址:https://blog.51cto.com/tuwei/2388226

时间: 2024-08-29 19:43:00

自动化运维Ansible实践(二)的相关文章

自动化运维Ansible实践(一)

第 1 章 Ansible概述 1.1 IT自动化的好处1.1.1 团队影响? 节省时间,提高工作效率? 消除重复任务? 更少的错误风险? 改善协作和工作满意度1.1.2 企业影响? 克服复杂性? 更多创新资源? 加强问责制和合规性1.2 Ansible是什么Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新.Ansible适用于管理企业IT基础设施,从具有少数主机的小规模到数千个实例的企业环境.Ansible也是一种简单的自动化语言,可

自动化运维Ansible批量部署服务+shell脚本批量推送公钥

一.概述分析 由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统方式进行维护会使得工作效率低下.这时,部署自动化运维就可以尽可能安全.高效地完成这些工作.一般会把自动化运维工具划分为两类:一类是需要使用代理工具的,也就是基于专用的ABem程序来完成管理功能,如: Puppet.Func. Zabbix等:另外一类是不需要配置代理工具的,可以直接基于SSH服务来完成管理功能,如: Ansible. Fabric等. - 下面介绍几款功能类似的自动化运

Linux下的自动化运维ansible工具

什么是自动化运维     随着信息时代的持续发展,IT运维已经成为IT服务内涵中重要的组成部分.面对越来越复杂的业务, 面对越来越多样化的用户需求,不断扩展的IT应用需要越来越合理的模式来保障IT服务能灵活便捷.安 全稳定地持续保障,这种模式中的保障因素就是IT运维(其他因素是更加优越的IT架构等).从初期的 几台服务器发展到庞大的数据中心,单靠人工已经无法满足在技术.业务.管理等方面的要求,那么标 准化.自动化.架构优化.过程优化等降低IT服务成本的因素越来越被人们所重视.其中,自动化最开始作

自动化运维Ansible之Playbook剧本(持续更新)

附上前两篇关于Ansible的博客地址,以供查阅,欢迎学习交流!自动化运维之Ansible概述及Ansible部署Ansible命令应用之常用模块 Playbook简介 playbook是ansible用于配置,部署,和管理被控节点的剧本. 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态.playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成. 也可以这么理解,playbook 字面意思,即剧本,现实中

关于自动化运维的实践×××

谈起自动化运维,现在已经成为运维工作最热门的词语,关于运维自动化本人早在2012年就已经接触了BMC的ITSM系统,将ITIL运维管理体系和自动化运维工具的有效的结合大幅度的提高了运维工作效率.下图为HP提的统一运维自动化理念和运维手册,从目前企业基础架构层来看,运维人员无关乎关心的如下几个方面的自动化. 要了解运维自动化在企业当中应用场景和是否真正能够解决运维团队工作的问题.那我们则需要站到企业运维人员的角度去考虑问题.那么我首先要知道一个企业或者运维团队在规划运维的时候所需要考虑的问题及面临

3.2 企业自动化运维ansible

ansible的Host-pattern ansible的Host-pattern 匹配主机的列表All :表示所有Inventory中的所有主机 ansible all –m ping:通配符 ansible "" -m ping 这个"*"号相当于all全部主机 ansible 192.168.1.* -m ping ansible "*srvs" -m ping 或关系 ansible "websrvs:appsrvs"

saltstack 自动化运维神器(二)

文件同步: 其实在做openstack的运维对一些文件的同步其实是很繁琐.有一个配置项或者一行代码的源码文件进行同步.那么现在我们就开始介绍saltstack的文件同步功能 环境说明:操作系统版本:rhel6.5x64 1.master配置同步根目录 在开始saltstack的配置管理之前,要首先指定saltstack所有状态文件的根目录,在master上做如下操作 ## 首先修改master的配置文件,指定根目录,注意缩进全部使用两个空格来代替Tab(python规范)## 确定指定的目录是否

saltstack 自动化运维神器(二)文件同步

文件同步: 其实在做openstack的运维对一些文件的同步其实是很繁琐.有一个配置项或者一行代码的源码文件进行同步.那么现在我们就开始介绍saltstack的文件同步功能 环境说明:操作系统版本:rhel6.5x64 1.master配置同步根目录 在开始saltstack的配置管理之前,要首先指定saltstack所有状态文件的根目录,在master上做如下操作 ## 首先修改master的配置文件,指定根目录,注意缩进全部使用两个空格来代替Tab(python规范)## 确定指定的目录是否

自动化运维Ansible之安装部署

目录 1.SSH分发 2.安装Ansible 3.Ansible清单管理 1.SSH分发 ansible自动化部署条件 1.建议基于ssh密钥方式建立远程连接 2.基于ssh口令方式建立远程连接(不建议) 在部署之前需要保证管理主机和受控主机能够基于ssh密钥的方式进行远程连接 管理主机生成SSH密钥(私钥和公钥),分发公钥到每台受控主机: 1.安装sshpass [[email protected] ~]# yum install sshpass -y 2.生成密钥 // 直接生成密钥 [[e