Play-book

Ansible是一个完全简单的模型驱动的配置管理、部署和命令执行框架。

对于ansible的playbook就是完全的配置管理框架,它类似于saltstack的state system

对于被管理的节点不需要安装任何软件依赖及ansible

使用playbook的准备工作:

  1. 选择一台机器作为你的管理节点,并且安装ansible

  2. 确保你的这台机器上拥有你所要管理机器的SSH秘钥,因为ansible使用SSH登录管理

  3. 创建主机文件,将你所要管理的节点信息加入到主机文件中

请确保以上三步已经被正确设置好,可以使用以下命令来验证:

ansible testgroup -m ping test1 | success >> {    "changed": false,    "ping": "pong"} lightcloud | success >> {    "changed": false,    "ping": "pong"}

ansible连接到testgroup中的每一台主机,传送所需的模块至每个节点并执行,返回模块的输出内容。

ansible目前有很多管理模块,我们可以根据这些模块来写出等幂的playbook。

模拟这样的一个场景,使用ansible的playbook来管理节点的DNS配置文件。这里用到以下几个知识点:

  1. 使用template模块,使用模板文件动态生成dns配置文件中的nameserver

  2. 使用fetch模块,将被管理节点上的dns配置文件fetch到管理节点

  3. 模板的使用,编写模板文件

Playbook:

---- hosts: testgroup  vars:      name: coocla      resolver-servers:      - 223.5.5.5      - 223.6.6.6  user: root  tasks:  - name: Deploy resolv.conf    template: src=files/resolv.j2 desc=/etc/resolv.conf mode=0444  - name: Fetch node file    fetch: src=/etc/resolv.conf desct=/tmp/fetchfile

这里我们首先指定了hosts(target),然后声明了两个变量name和resolver-server,并且使用root来运行此次的task, 使用tasks关键字来声明以下内容为需要运行的任务,任务详情则是调用对于功能的module

Template:

# resolv.j2 by {
{ name | upper }}# for  {
{ ansible_eth0.ipv4.address }}{% if domain is defined -%}domain {
{ domain }}{% endif -%}{% for ns in resolvers -%}nameserver {
{ ns }}{% endfor %}

这里我们引用了定义的变量name,并使用过滤器赋值给upper将其转换为大写;其次我们引用了ansible的facts(类似于saltstack中的grains),内置的facts变量可以使用setup模块来查看(ansible testgroup -m setup)。接下来则使用了jinja的if和for语法来对变量进行判断和循环引用。

目前为止一切工作准备就绪,现在可以把这些任务跑一跑了:

ansible-playbook learn-template.yml PLAY [testgroup] ************************************************************** GATHERING FACTS ***************************************************************ok: [test1]ok: [lightcloud] TASK: [Depoly resolv.conf] ****************************************************changed: [test1]changed: [lightcloud] TASK: [Fetch node file] *******************************************************changed: [test1]changed: [lightcloud] PLAY RECAP ********************************************************************lightcloud                 : ok=3    changed=2    unreachable=0    failed=0test1                      : ok=3    changed=2    unreachable=0    failed=0

由以上输出可见,一共有个两个任务,在两个节点上均正常运行结束.

cat /tmp/fetchfile/xxxx/etc/resolv.conf# resolv.in by COOCLA# for xxxxnameserver 223.5.5.5nameserver 223.6.6.6

查看fetch到的文件内容也是我们之前预期的结果。