ansible playbook

一、 yaml语法简介

在单一档案中,可用连续三个连字符号(---)区分多个档案

次行开始正常写playbook的内容,一般建议写明该playbook的功能

使用#注释

缩进必须是统一的,不能空格和tab混用

缩进的级别必须是一致的,同样的缩进达标同样的级别,

yaml我呢见区分大小写

多个k/v可同行写也可换行写,同行使用逗号分隔

v可以是字符串,也可以是另一个列表

一个完成的代码块功能需最少元素包括name和task

一个name只能包括一个task

yaml文件扩展名通常为yml或yaml

List: 列表,其所有严肃均使用”-“ 大头

Dictionary: 字典,通常由多个key与value构成,也可以放置于{}中

二、Playbook核心元素

hosts 执行的远程主机列表

tasks 人物集

varniables 内置变量或自定义变量在playbook中调用

template 模板,可替换模板文件中变量并实现一些简单逻辑文件

handlers和notity结合使用,由特定条件触发的操作,满足条件方才执行

tags 标签,指定某条任务执行,用于选择运行行ploybook中的部分代码

三、playbook基础组件

remote_user: 可用于host和task中。也可以指定通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

- hosts: webserver    remote_user: rooot  tasks:  - name: test connection    ping    sudo: yes    sudo_user:wang

运行playboook

ansible-playbook filename.yaml [options]

常见选项

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

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

--list-tags  列出tag

--list-tasks 列出task

--limit 主机列表 只正对主机列表中的主机执行

-v -vv -vvv 显示过程

编写安装httpd的playbook例子

---- hosts: serverremote_user: roottasks:  - name: install    yum: name=httpd  - name: config    copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/  - name: service    service: name=httpd state=started enabled=yes

二进制安装mariadb

---- hosts: appserverremote_user: roottasks:  - name: user    user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin  - name: unarchive   unarchive src=压缩包 dest=/usr/local owner=mysql group=root  - name: mysql link    file: src=解压后文件夹 dest=路径 state=link  - name: create director    file: /data/mysql state=director  - name owner group    file: path=/data/mysql owner=mysql group=mysql  - name: mysql database    shell: chdir=路径/scripts scripts/mysql_install_db --datadir=/data/mysql --user=mysql  - name: path    file: content=‘PATH=/usr/local/mysql/bin:$PATH‘ dest=/etc/profile.d/mysql.sh  - name: config   copy: 拷贝文件  - name: service  - name: start service(自己补充去...)

handlers和notify 结合使用触发条件

handlers

是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作

notify此action可用于在每个play的最后被触发,避免多次有改变发生时每次都执行指定的操作,在notify中列出的操作都成为handler

---- hosts: serverremote_user: roottasks:  - name: install    yum: name=httpd  - name: config    copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/    notify: restart httpd  - name: service    service: name=httpd state=started enabled=yeshandler:   - name: restart httpd    service: name=httpd state=restarted

 playbook中tags的使用

给某一个动作加一个标签,后面可以挑着执行
- hosts: serverremote_user: roottasks:  - name: install    yum: name=httpd  - name: config    copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/   tags: copy    notify: restart httpd  - name: service    service: name=httpd state=started enabled=yes执行: ansible-playbook -t copy httpd.yaml

playbook中变量使用

调用变量: 两个花括号

变量名: 仅能由字母、数字和下划线组成,且只能以字母开头

变量来源:

   1. ansible setup facts 远程主机的所有变量都可以直接调用  

  setup模块: 显示主机上的各种信息

  ansible all -m setup -a ‘filter=ansible_fqdn‘

2. 在/etc/ansible/hosts中定义

      普通变量:主机组中主机单独定义,优先级高于公共变量

             公共组变量:针对主机组中所有主机定义统一变量

  [webserver]

  ip

  [webserver:vars]

  ntp_server=ntp.cn.com

  ngs_server=nfs.cn.com

3. 通过命令行指定变量,优先级最高

  ansible-playbook -e varname=value

4. 在playbook中定义

  vars

    - var1: value1

    - var2: value2

5. 在独立的变量yaml文件中定义  

  hostname: testnode
    suf: log

  调用:在文件里面写上文件  vars_fies: vars.yml

6.在role中定义

模板template

文本文件,嵌套有脚本(使用模板变成语言编写)

Jinjia2语言, 使用字面量,有下面形式

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

数字: 整数,浮点数

列表:[item1, item2,...]

元组: (item1, item2,...)

字典: {key1: value1, key2: value2}

布尔型: true/false

算术运算:+, -, *, /, //, %, **

比较运算:==, !=, >, >=, <, <=

逻辑运算: and, or, not

流表达式: for, if, when

template功能: 根据模块文件动态生成对应的配置文件

template文件必须存放于templates目录下,且命名为.j2结尾

yaml/yml文件需和templates目录平级,结果如下

./

  temnginx.yml

  templates

    nginx.conf.j2

应用在yml的tasks下

  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

  ps: 主要按照格式来写,src直接写文件名即可

when 类似if

条件测试:如果需要根据变量、facts或此前任务的执行结果来作为或task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinjia2语法格式

when语句

在task后添加when子句即可使用条件测试;when语句支持jinjia2

ansible playbook

迭代: with_items

迭代:当有需要重复性执行的让你无时,可以使用迭代机制

对迭代项的引用,固定变量名为 item

要在task中使用with_items给要迭代的元素列表

列表格式:

  字符串

  字典

示例

- name: add serveral users

  user: name={{item}} state=present group=wheel

  with_items:

    - testuser1

  - testuser2

ansible playbook

 playbook中template for if

ansible playbook

roles

ansible 1.2版本引入的新特性,用于层次化,结构化的组织playbook,roles能够根据层次型结构自动装载变量文件、task及handlers等,要使用roles只需要在playbook中使用include指令即可。roles就是将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

复杂场景: 建议使用roles, 代码服务度高

变更指定主机或主机组

如命名不规范维护和传承成本大

某些功能需要多个playbook, 通过include即可

角色: 角色集合

usercof.yml

roles/

  mysql/

    tasks

      main.yml

      create_dir.yml

      static_dir.yml

    files

      main.yml

    vars

      main.yml

  httpd/

ansible playbook

ansible playbook

roles各目录作用

ansible playbook

以nginx为例

mkdir roles/nginx/{tasks,files} -pv

cd roles/nginx/

vim tasks/user.yml

- name: create user
user: name=nginx shell=/sbin/nologin system=yes create_home=no

vim install.yml

- name: install
yum: name=nginx

cp /usr/local/nginx/conf/nginx.conf.default /data/ploybook/roles/nginx/files/

vim sysconfig.yml

- name: config
copy: src=nginx.conf dest=/etc/nginx/

vim service.yml

- name: service
service: name=nginx state=started enabled=yes

vim main.yml

- include: user.yml
- include: install.yml
- include: config.yml
- include: service.yml

vim nginx_role.yml

- hosts: appservers
  roles:
    - role: nginx

引用

ansible-playbook nginx_role.yml

目录结构

ansible playbook