Ansible 中 Playbook 的介绍

  • 1. Playbook 的功能
  • 2. YAML
  • 3. playbook 执行命令
  • 4. Playbook的核心组件
  • 5. vim 设定技巧


1. Playbook 的功能

  • playbook 是由一个或多个 play 组成的列表;
  • Playboot 文件使用 YAML 来写的。

2. YAML

  • 简介:
    YAML 是一种表达资料序列的格式,类似XML;
    Yet Another Markup Language;
    2001年首次发表;
    www.yaml.org;
  • 特点
    可读性好、和脚本语言交互性好、易于实现、适用程序执行流梳理方式、可扩展性强
  • 语法简介
    在文件中用[---]开始;
    在文件中用[...]结尾;
    次行一般书写文件内容,缩进严格,大小写敏感;
    key/value可以多行书写也可一行书写,一行书写用隔开;
    value可以是个字符串,也可是list;
    一个play需要包括nametasks
    name 是描述,,tasks 是动作;
    一个 name 只能包含一个 task;
    扩展名称 yml或者yaml
  • YAML 列表
[Linux,C++,Java,Python]
或者是
-Linux
-C++
-Java
-Python
  • YAML 的字典
    字典作用存放键值,键值存放在列表中;列表也可以在字典中;
name:westos
age:12
jobs:linux


{name: "westos", age: "12", jobs: "linux"}

前面有 - 的是列表,没有 - 的是字典。

如编写一个 playbook ,内容如下图所示,其中前面的--- 为固定的开始格式,- name为一个列表,列表里面包含一个字典,字典的内容是一一对应的,可见列表里面包含字典,字典里面也可以包含列表。

ansibleplaybook的语法 ansible-playbook 参数_vim

3. playbook 执行命令

ansible-playbook xxx.yml ...	##执行动作
--check|-C		##检测
--syntax-check	##check language
--list-hosts	##列出hosts
--list-tags		##列出tag
--list-tasks	##列出task
--limit			##指定执行主机
-v -vv			##显示过程

对于上面编写的脚本可以用命令来执行;

命令 ansible-playbook -C test.yml 表示预执行,有输出的效果;

ansibleplaybook的语法 ansible-playbook 参数_ansibleplaybook的语法_02

命令 ansible-playbook --syntax-check test.yml 用来检测语言,不做执行动作,只做检测;如图所示没有问题时只显示 playbook 脚本;

ansibleplaybook的语法 ansible-playbook 参数_vim_03


用命令 ansible-playbook --list-hosts test.yml 来列出执行的所有主机;

用命令 ansible-playbook --list-tags test.yml 来列出所有的tag;

用命令 ansible-playbook --list-tasks test.yml 来列出所有的 task;

ansibleplaybook的语法 ansible-playbook 参数_运维_04

用命令 ansible-playbook --limit 172.25.254.100 test.yml -C 来指定主机执行;

ansibleplaybook的语法 ansible-playbook 参数_运维_05

在执行 playbook 剧本的时候,默认是只会有运行过程,但是并没有详细信息,可以加参数 -v -vv -vvv当 v 越多时代表越详细,最多就是三个;

ansibleplaybook的语法 ansible-playbook 参数_运维_06

4. Playbook的核心组件

  1. name :可选,建议使用多用于说明
  2. hosts :受控主机列表
  3. tasks :任务,用与选择执行部分代码

基本示例
有无 name 来观察效果;可以看到有无 name 的执行效果一致,但一般建议写上,因为当 play 片段比较多时,当检测出错时方便定位问题。

ansibleplaybook的语法 ansible-playbook 参数_Ansible_07


ansibleplaybook的语法 ansible-playbook 参数_运维_08


示例:用 playbook 的方式在受控主机中安装 httpd 服务

编写 playbook 如下图所示:

第1行为起始标识,第5行 name 表示安装 apache,调用 dnf 模块,其中 state: latest 表示更新,disable_gpg_check 表示安装时不检测;
第11行至15行,表示开启 apache,调用的模块是 service ,其中 state: started 表示开启, enabled 表示设定开机自启;
第17至23行表示设定火墙策略,允许 apache,调用 firewalld 模块,其中 immediate 表示立即生效,service服务名称,zone火墙的域,permanent 永久生效,state: enbaled 允许;
第25至29行表示设定发布页面内容,调用 lineinfile 模块,其中 ipath指定要操作的文件,line指定文本内容,create 表示当文件不存在时,创建对应的文件。

ansibleplaybook的语法 ansible-playbook 参数_vim_09

在执行前先查看一下被控主机中是否已经安装了 apache,在检测一下剧本是否有语法上的错误;

如图表示被控主机上还没有安装 apache ;

ansibleplaybook的语法 ansible-playbook 参数_Ansible_10


检测剧本的语法问题,如图所示表明剧本没有问题;

ansibleplaybook的语法 ansible-playbook 参数_Ansible_11

执行剧本来安装 apache ;

ansibleplaybook的语法 ansible-playbook 参数_vim_12

访问被控主机的 IP,查看发布页面是否正常显示;

ansibleplaybook的语法 ansible-playbook 参数_ansibleplaybook的语法_13

:在写的过程中如果对于某一个模块的设定不是很确定,可以用命令 ansible-doc 加上对应的模块来查看其帮助。

5. vim 设定技巧

  • autocmd FileType yaml setlocal ai ts=2 sw=2 et
  • setlocal ##设定当前文件
  • ai ##自动退格对齐 auto indent
  • ts ##tab建长度为2空格 tabstop=2
  • sw ##缩进长度为2 shiftwidth=2
  • et ##把tab键变成空格 expandtab

可以编辑 vim 的设定,如图所示,表示设定行号,指定一个 Tab 为两个空格,ai 表示自动补齐,et 表示将 tab 可以拆分。

ansibleplaybook的语法 ansible-playbook 参数_Ansible_14

设定文件内容入下图所示,第一行 autocmd Filetype 表示在指定什么类型的文件; yaml 表示 yaml 的文件时会生效,setlocal 表示只对当前的文件生效,再次打开其他的文件时还是不生效;指定一个 Tab 为两个空格,ai 表示自动补齐,et 表示将 tab 可以拆分;sw 表示缩进长度为2。

ansibleplaybook的语法 ansible-playbook 参数_运维_15

练习

  1. 用 playbook 剧本的方式在安装 vsftpd 服务,允许匿名用户访问,并发布一个文件 /var/ftp ;

编写剧本信息如下图所示:

[root@Ansible .ansible]# vim vsftpd.yaml
[root@Ansible .ansible]# cat  vsftpd.yaml
---
- name: vsftpd server
  hosts: 172.25.254.100
  tasks:
    - name: install vsftpd		##安装 vsftpd 服务
      dnf:
        name: vsftpd
        state: latest
        disable_gpg_check: yes

    - name: install ftp			##客户端,用来测试,可以不需要这一步
      dnf:
        name: lftp
        state: latest
        disable_gpg_check: yes

    - name: vsftpd setup 		##修改配置文件,允许匿名用户访问
      lineinfile:
        path: /etc/vsftpd/vsftpd.conf
        regexp: "anonymous_enable"
        line: "anonymous_enable=YES"

    - name: start vsftpd		##开启服务
      service:
        name: vsftpd
        state: started
        enabled: yes

    - name: firewalld setup		##设定火墙策略
      firewalld:
        service: ftp
        permanent: yes
        state: enabled
        immediate: yes
        zone: public

    - name: touch zxkfile		##建立发布文件
      file:
        path: /var/ftp/zxkfile
        state: touch

测试结果如下图所示:

ansibleplaybook的语法 ansible-playbook 参数_ansible_16


完成之后,访问发布目录查看发布文件结果如图所示:

ansibleplaybook的语法 ansible-playbook 参数_vim_17

:以上过程要确定受控主机中的 selinux 的开启状态,此过程没有考虑到 selinux 为开启的状态,当 selinux 开启时,需要关闭重启系统来可以允许客户端访问。

  1. 用 playbook 剧本的方式在安装 dns 服务,维护 westos.org 的域,在这个域中有三个网址,www.westos.org 对应的 ip 是 172.25.254.100,bbs.westos.org 对应的是 westosa.westos.org 对应的 ip 是 172.25.254.111 和 172.25.254.222。

在当前主机上安装软件,提供复制的模板文件;然后将生成的模板文件复制到 /tmp/ 目录中再进行编辑;

[root@Ansible tmp]# yum install bind -y
[root@Ansible .ansible]# ls
ansible.cfg  apache.yml  cp  inventory  test.yml  tmp  vsftpd.yaml  westos.yml
[root@Ansible .ansible]# cd /tmp/
[root@Ansible tmp]# cp /var/named/named.localhost westos.org.zone
[root@Ansible tmp]# cp /etc/named.rfc1912.zones named.rfc1912.zones
[root@Ansible tmp]# cp /etc/named.conf  .
[root@Ansible tmp]# ll
total 12
-rw-r-----. 1 root root 1705 May 10 10:20 named.conf
-rw-r-----. 1 root root 1029 May 10 10:18 named.rfc1912.zones
-rw-r-----. 1 root root  152 May 10 10:17 westos.org.zone
[root@Ansible tmp]# vim named.conf 

 10 options {
 11         listen-on port 53 { any; };
 12         listen-on-v6 port 53 { ::1; };
 13         directory       "/var/named";
 14         dump-file       "/var/named/data/cache_dump.db";
 15         statistics-file "/var/named/data/named_stats.txt";
 16         memstatistics-file "/var/named/data/named_mem_stats.txt";
 17         secroots-file   "/var/named/data/named.secroots";
 18         recursing-file  "/var/named/data/named.recursing";
 19         allow-query     { any; };

 31         recursion yes;
 32 
 33         dnssec-enable yes;
 34         dnssec-validation no;
 35 
[root@Ansible tmp]# vim named.rfc1912.zones 

 28 
 29 zone "westos.org" IN {
 30         type master;
 31         file "westos.org.zone";
 32         allow-update { none; };
 33 };
 34 
[root@Ansible tmp]# vim westos.org.zone

  1 $TTL 1D
  2 @       IN SOA  dns.westos.org. root.westos.org. (
  3                                         0       ; serial
  4                                         1D      ; refresh
  5                                         1H      ; retry
  6                                         1W      ; expire
  7                                         3H )    ; minimum
  8         NS      dns.westos.org.
  9 dns     A       172.25.254.100
 10 www     A       172.25.254.100
 11 bbs     CNAME   westosa.westos.org.
 12 westosa A       172.25.254.111
 13 westosa A       172.25.254.222
~

编辑 playbook 脚本内容如下所示:

[root@Ansible tmp]# cat dns.yml
---
- name: dns server
  hosts: 172.25.254.100
  tasks:
    - name: install dns		##安装服务
      dnf:
        name: bind
        state: latest

    - name: make configure file		##复制文件
      copy:
        src: ./tmp/named.conf
        dest: /etc/named.conf
        owner: root
        group: named
        mode: "0660"

    - copy:							##复制文件
        src: ./tmp/named.rfc1912.zones
        dest: /etc/named.rfc1912.zones
        owner: root
        group: named
        mode: "0660"

    - copy:							##复制文件
        src: ./tmp/westos.org.zone
        dest: /var/named/westos.org.zone
        owner: root
        group: named
        mode: "0660"

    - name: start named				##开启服务
      service:
        name: named
        state: started
        enabled: yes

    - name: firewalld setup			##设定火墙
      firewalld:
        service: dns
        state: enbaled
        permanent: yes
        zone: public
        immediate: yes

测试结果如图所示:

ansibleplaybook的语法 ansible-playbook 参数_ansible_18