ansible playbook

Posted guniang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: server
remote_user: root

tasks:
- 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: appserver
remote_user: root

tasks:
- 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: server
remote_user: root

tasks:
- 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=yes
handler:
- name: restart httpd
service: name=httpd state=restarted

 

 playbook中tags的使用

给某一个动作加一个标签,后面可以挑着执行

- hosts: server
remote_user: root

tasks:
- 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

  技术图片

 

迭代: with_items

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

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

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

  列表格式:

    字符串

    字典

  示例

  - name: add serveral users

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

    with_items:

      - testuser1

    - testuser2

技术图片

 

 playbook中template for if

技术图片

 

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/

技术图片

 

技术图片

 

roles各目录作用

技术图片

 

以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的主要内容,如果未能解决你的问题,请参考以下文章

Ansible 笔记 - 编写 playbook

d8,ansible

ansible playbook

1. ansible-playbook 变量定义与引用

ansible-playbook ERROR! Syntax Error

Jenkins+GitLab+Ansible playbook安装与基本使用