Asible-playbook

Playbook

playbook简介

playbook是什么?

Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.
Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常之强大的.
简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础, 非常适合于复杂应用的部署.
在playbook中我们可以编排有序的执行过程,甚至可以实现多组机器之间来回有序执行我们指定的任务!并且可以实现同步或异步的发起任务
在使用adhoc时,我们主要使用/usr/bin/ansible 程序执行任务,在使用playbook时,我们更多的是将任务别写在剧本文件当中,使用ansible-playbook命令读取执行任务

Playbook 语言的示例

Playbooks 的格式是YAML, playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表! 在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务就是一个对 ansible 模块的调用
通过 playbook,可以编排步骤进行多机器的部署,比如在 webservers 组的所有机器上运行一定的步骤, 然后在 database server 组运行一些步骤,最后回到 webservers 组,再运行一些步骤,诸如此类.
下面有一个playbook的例子:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

playbook的基础

主机和用户
你可以为 playbook 中的每一个 play,去选择要操作的目标机器是哪些,以哪个用户身份去完成要执行的步骤

---
- hosts: webservers
  remote_user: root

我们也还可以在一个任务中定义自己的远程用户:

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

也支持sudo的调用
---
- hosts: webservers
  remote_user: yourname
  sudo: yes

如果你需要在使用 sudo 时指定密码,可在运行 ansible-playbook 命令时加上选项 --ask-sudo-pass (-K)

Tasks 列表

每个play都包含一个task列表(任务列表),一个task在目标主机执行完毕后,才会执行下一个任务,需要大家明白的是,在同一个play当中,所有的主机都会收到接受到相同的指令,
每个 task 的目标在于执行一个模块(module), 通常是带有特定的参数来执行.在参数中可以使用变量
modules 具有”幂等”性,意思是如果你再一次地执行 moudle,moudle 只会执行必要的改动,只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.
每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的. 如果没有定义 name,‘action’ 的值将会用作输出信息中标记特定的 task.

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

tasks:
  - name: make sure apache is running
    service: name=httpd state=running

但是有两个特殊的模块shell模块和command模块,它们不是用key=value的格式,而是这样的:

tasks:
  - name: disable selinux
    command: /sbin/setenforce 0

使用shell模块和command模块我们需要考虑返回码的问题,若返回码不为0说明命令没有执行成功,那么模块执行的状态也为失败,任务可能就会终止,我们可以按如下执行来解决状态码的问题:

tasks:
 - name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者:
tasks:
 - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True

变量定义

  • 合法的变量名
    在使用变量之前最好先知道什么是合法的变量名. 变量名可以为字母,数字以及下划线.变量始终应该以字母开头

  • 在Inventory(清单文件)中定义变量

  • 在playbook中定义变量

 - hosts: webservers
  vars:
http_port: 80

变量的引用

  • playbook中引用变量
我们可以在playbook文件中引用变量
 - hosts: webservers
  vars:
base_dir: /usr/local/nginx
  shell: {{ base_dur }}/sbin/nignx
  • 模板文件中引用变量
    我们也可以通过template模块将变量引用到文件当中,Ansible允许你使用Jinja2模板系统在playbook中引用变量
    例如:
    我们创建文件file.j2,内容:
    mysql name is {{ user_name }}
在playbook文件中定义变量:
 - hosts: webservers
  vars:
user_name: tom
  tasks:
 - name: copy a fille to host
  	template: src=file.j2  dest=/root/

template常用于配置文件的推送,我们可以把一些常用的参数,例如nginx的监听地址,网站根目录,网站域名等!我们可以把这些参数都做成变量,然后在配置文件中引用,这样我们以后只需更改playbook文件中变量的值即可!增加了配置的灵活度

  • YAML陷阱
    YAML语法要求如果值以{{ foo }}开头的话我们需要将整行用双引号包起来.这是为了确认你不是想声明一个YAML字典!
例子:
错误的写法:


- hosts: app_servers
  vars:
      app_path: {{ base_path }}/22

正确的写法:
 - hosts: app_servers
  vars:
       app_path: "{{ base_path }}/22"
  • 使用Facts获取的信息
    在ansible中有些自带的变量,不需要用户定义,直接引用就可以
    Facts通过访问远程系统获取相应的信息,比如像查看远程主机的ip地址和系统版本,那么我们可以执行:
    ansible hostname -m setup

不过这样执行会返回非常多的变量数据!这里面的变量我们都可以直接引用!
例如{{ ansible_hostname }}就可以获取远程主机的主机名,{{ ansible_eth0[“ipv4”][“address”] }}获取eth0的ipv4的ip地址,当然这些变量我们也可以通过template模块,直接在模板文件中引用

  • 变量文件分割
    我们有时可能会有敏感数据存放到playbook当中的情况,比如账号密码等!那么如果直接公开我们的playbook源码可能会有隐私数据泄露的情况!那么我么可以把这些敏感数据可以跟playbook进行分割!
我们可以把变量在一个外部变量文件中定义:

---
somevar: somevalue
password: magic

在playbook中直接引用这个变量文件
---
- hosts: all
  remote_user: root
  vars:
    favcolor: blue
  vars_files:
    - /vars/vars.yml

  tasks:

  - name: this is just a placeholder
    command: /bin/echo foo

Handlers: 在发生改变时执行的操作

我们可以使用handlers定义一些触发任务,这些触发任务可以在其他的任务中调用,但是执行条件是该任务有更改时才会触发这些触发任务!

比如如下例子:

- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
     - restart memcached
     - restart apache
handlers:
    - name: restart memcached
      service:  name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted

重启memcache和apache只有当我们使用template模块分发的配置文件有更改时才会被执行,如果配置文件没有更改则不会执行重启

Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值