zoukankan      html  css  js  c++  java
  • Ansible Playbook 初识

    Ansible Playbook 基本概述与使用案例

    主机规划

    添加用户账号

    说明:

    1、 运维人员使用的登录账号;

    2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;

    3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。

    复制代码
    1 # 使用一个专门的用户,避免直接使用root用户
    2 # 添加用户、指定家目录并指定用户密码
    3 # sudo提权
    4 # 让其它普通用户可以进入该目录查看信息
    5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
    6 echo "yun  ALL=(ALL)       NOPASSWD: ALL" >>  /etc/sudoers
    7 chmod 755 /app/
    复制代码

    Ansible 配置清单Inventory

    之后文章都是如下主机配置清单

    复制代码
     1 [yun@ansi-manager ansible_info]$ pwd
     2 /app/ansible_info
     3 [yun@ansi-manager ansible_info]$ cat hosts_key 
     4 # 方式1、主机 + 端口 + 密钥
     5 [manageservers]
     6 172.16.1.180:22
     7 
     8 [proxyservers]
     9 172.16.1.18[1:2]:22
    10 
    11 # 方式2:别名 + 主机 + 端口 + 密码
    12 [webservers]
    13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
    14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
    15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
    复制代码

    Playbook 基本概述

    什么是 playbook,playbook 翻译过来就是“剧本”,那 playbook 组成如下:

    1、play:定义主机角色「比作:剧本中的角色」

    2、task:定义具体执行任务「比作:剧本中的角色要做什么事儿」

    3、playbook:由一个或多个play组成,一个 play 可以包含多个 task 任务

    简单理解:使用不同的模块完成一项事情

    Playbook 优势

    1、功能上比 Ad-Hoc 更全

    2、能很好的控制先后执行顺序,以及依赖关系

    3、语法更加直观,可读性更好

    4、Ad-Hoc 是临时的无法持久使用,Playbook 可以持久化使用。

    Playbook 书写格式

    Playbook 是有 yml 语法书写,结构清晰,可读性强。

    Playbook 示例-安装部署 httpd

    要求:在 172.16.1.180、172.16.1.181、172.16.1.182 安装 httpd 服务。

    test_httpd.yml 脚本内容

    说明:其中 172.16.1.181 和 172.16.1.182 已经安装好了 httpd 服务。

    脚本参数说明:

    host:指定主机

    remote_user:要使用什么用户操作

    tasks:具体执行什么任务

    复制代码
     1 [yun@ansi-manager object01]$ pwd
     2 /app/ansible_info/object01
     3 [yun@ansi-manager object01]$ ll ../  # 主机清单存放位置
     4 total 16
     5 -rw-rw-r-- 1 yun yun 226 Oct  8 16:07 hosts_key  # 主机清单文件
     6 drwxrwxr-x 2 yun yun  28 Oct 11 19:24 object01
     7 [yun@ansi-manager object01]$ ll
     8 total 4
     9 -rw-rw-r-- 1 yun yun 937 Oct 11 19:24 test_httpd.yml 
    10 [yun@ansi-manager object01]$ cat test_httpd.yml  # playbook 内容
    11 ---
    12 # 上面一行表明这是一个 yml 文件,无其他作用
    13 # test playbook
    14 - hosts: manageservers, proxyservers  # 定义主机组 「可以有多个主机组 使用 逗号加空格 隔开」
    15   # remote_user: yun    # 可省略该行  定义用户的身份「我们按之前的约定使用的 yun 用户,因此这里也是 yun 用户」
    16 
    17   tasks:               # 定义运行什么样的任务
    18     - name: "Installed httpd server"  # 第一个任务 描述
    19       yum: name=httpd state=present   # 执行什么模块「第一种书写方式,如果该行很长,会有折行的情况,不怎么美观」
    20 
    21     - name: "site update"             # 第二个任务 描述「第二种书写方式,推荐,更规范人性化」
    22       copy:
    23         content: "Test WEB"
    24         dest: "/var/www/html/index.html"
    25 
    26     - name: "start httpd server"
    27       systemd:
    28         name: httpd
    29         daemon_reload: yes
    30         state: started
    31         enabled: yes
    复制代码

    语法检查

    1 # 由于我们使用的是 yun 普通用户
    2 # 因此有时需要使用 -b 选择进行提权
    3 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key --syntax-check test_httpd.yml
    4 
    5 playbook: test_httpd.yml

    预执行

    如果存在依赖关系【如:软件安装,配置,启动】,那么可能预执行报错,但是执行是正常的。

    因为后面的「启动」依赖前面的「配置」,「配置」依赖前面的「软件安装」。

    因此如果报错,那么详细看看。确定是存在问题还是依赖关系导致的。

    复制代码
     1 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key -C test_httpd.yml
     2 
     3 PLAY [manageservers, proxyservers] ***************************************************************************************
     4 
     5 TASK [Gathering Facts] **************************************************************************************************
     6 ok: [172.16.1.180]
     7 ok: [172.16.1.182]
     8 ok: [172.16.1.181]
     9 
    10 TASK [Installed httpd server] *******************************************************************************************
    11 ok: [172.16.1.182]
    12 ok: [172.16.1.181]
    13 changed: [172.16.1.180]
    14 
    15 TASK [site update] ******************************************************************************************************
    16 changed: [172.16.1.180]
    17 changed: [172.16.1.181]
    18 changed: [172.16.1.182]
    19 
    20 TASK [start httpd server] ***********************************************************************************************
    21 changed: [172.16.1.180]
    22 changed: [172.16.1.181]
    23 changed: [172.16.1.182]
    24 
    25 PLAY RECAP **************************************************************************************************************
    26 172.16.1.180               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    27 172.16.1.181               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    28 172.16.1.182               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    复制代码

    执行 test_httpd.yml

    复制代码
     1 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key test_httpd.yml
     2 
     3 PLAY [manageservers, proxyservers] **************************************************************************************
     4 
     5 TASK [Gathering Facts] *************************************************************************************************
     6 ok: [172.16.1.182]
     7 ok: [172.16.1.180]
     8 ok: [172.16.1.181]
     9 
    10 TASK [Installed httpd server] ******************************************************************************************
    11 ok: [172.16.1.182]
    12 ok: [172.16.1.181]
    13 ok: [172.16.1.180]
    14 
    15 TASK [site update] *****************************************************************************************************
    16 changed: [172.16.1.181]
    17 changed: [172.16.1.182]
    18 changed: [172.16.1.180]
    19 
    20 TASK [start httpd server] **********************************************************************************************
    21 ok: [172.16.1.180]
    22 ok: [172.16.1.182]
    23 ok: [172.16.1.181]
    24 
    25 PLAY RECAP *************************************************************************************************************
    26 172.16.1.180               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    27 172.16.1.181               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    28 172.16.1.182               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    复制代码

    然后在 172.16.1.180、172.16.1.181、172.16.1.182 可见 httpd 安装部署已完成、服务已启动且已加入开机自启动;浏览器也能正常访问。

    Playbook 示例-安装部署 nfs

    要求:在 172.16.1.180 安装 NFS 服务端,在 172.16.1.181、172.16.1.182 挂载 NFS。

    test_nfs.yml 脚本内容

    复制代码
     1 [yun@ansi-manager object01]$ pwd
     2 /app/ansible_info/object01
     3 [yun@ansi-manager object01]$ ll
     4 total 8
     5 -rw-rw-r-- 1 yun yun  937 Oct 11 19:24 test_httpd.yml
     6 -rw-rw-r-- 1 yun yun 1434 Oct 11 19:50 test_nfs.yml
     7 [yun@ansi-manager ansible_info]$ cat test_nfs.yml  # playbook 内容
     8 ---
     9 # 必要包安装
    10 - hosts: manageservers, proxyservers
    11 
    12   tasks:
    13     - name: "NFS package install"
    14       yum:
    15         name:
    16           - nfs-utils
    17           - rpcbind
    18         state: present
    19 
    20 # 服务端配置与启动
    21 - hosts: manageservers
    22 
    23   tasks:
    24     - name: "create NFS dir"
    25       file:
    26         path: /data
    27         owner: nfsnobody
    28         group: nfsnobody
    29         state: directory
    30         recurse: yes
    31 
    32     - name: "NFS server config and start"
    33       copy:
    34         content: "/data   172.16.1.0/24(rw,sync,root_squash,all_squash)
    "
    35         dest: /etc/exports
    36         owner: root
    37         group: root
    38         mode: '644'
    39       # 当配置文件改变时,需要重加载 NFS 服务
    40       notify: "reload NFS server"
    41 
    42     - name: "rpcbind server start"
    43       systemd:
    44         name: rpcbind
    45         state: started
    46         daemon_reload: yes
    47         enabled: yes
    48 
    49     - name: "NFS server start"
    50       systemd:
    51         name: nfs
    52         state: started
    53         daemon_reload: yes
    54         enabled: yes
    55 
    56   handlers:
    57     - name: "reload NFS server"
    58       systemd:
    59         name: nfs
    60         state: reloaded
    61 
    62 # 客户端操作
    63 - hosts: proxyservers
    64 
    65   tasks:
    66     - name: "rpcbind server start"
    67       systemd:
    68         name: rpcbind
    69         state: started
    70         daemon_reload: yes
    71         enabled: yes
    72 
    73     - name: "mount NFS"
    74       mount:
    75         src: 172.16.1.180:/data
    76         path: /mnt
    77         fstype: nfs
    78         state: mounted
    79         backup: True
    复制代码

    语法检查

    1 # 由于我们使用的是 yun 普通用户
    2 # 因此有时需要使用 -b 选择进行提权
    3 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key --syntax-check test_nfs.yml 
    4 
    5 playbook: test_nfs.yml

    预执行

    如果存在依赖关系【如:软件安装,配置,启动】,那么可能预执行报错,但是执行是正常的。

    因为后面的「启动」依赖前面的「配置」,「配置」依赖前面的「软件安装」。

    因此如果报错,那么详细看看。确定是存在问题还是依赖关系导致的。

    [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key -C test_nfs.yml  # 具体打印内容,这里省略

    执行 test_nfs.yml

    [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key test_nfs.yml  # 具体打印内容,这里省略

    然后在 172.16.1.180 可见 NFS 服务已经部署且启动成功。

    在 172.16.1.181、172.16.1.182 可见 NFS 挂载成功,且已写入 /etc/fstab 文件。

  • 相关阅读:
    CSS盒子模型
    getContextPath、getServletPath、getRequestURI、request.getRealPath的区别
    MYSQL中的CASE WHEN END AS
    单点登录的精华总结
    git&github
    June 21st 2017 Week 25th Wednesday
    June 20th 2017 Week 25th Tuesday
    June 19th 2017 Week 25th Monday
    June 18th 2017 Week 25th Sunday
    June 17th 2017 Week 24th Saturday
  • 原文地址:https://www.cnblogs.com/shetao/p/14338665.html
Copyright © 2011-2022 走看看