ansible--使用ansible进行lnmp环境部署

ansible是什么

    ansible是红帽旗下,使用python语言开发,基于ssh协议工作的一款运维工具,与其相似的工具还有puppet、cfengine、chef、func、saltstack,fabric等。
    ansible融合了其他自动化运维工具的优点,实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。

ansible的架构

ansible--使用ansible进行lnmp环境部署_第1张图片
架构图
  • Ansible:核心引擎
  • Modules:包括 Ansible 自带的核心模块(core modules)及自定义模块 (custom modules);
         1. 核心模块:ansible执行的任何任务都不是有自身进行完成,而是调用各种核心模块进行完成;管理主机之前,先调用croe modules进中的模块,然后指明Host Inventory中的主机,完成指定的任务。
         2.自定义模块:ansible支持使用任务语言进行模块的开发,用于补充核心模块的功能不足。
  • Ansible:核心引擎
  • HostInventory :ansible中的主机清单
  • Playbooks :YAML格式文件,提高ansible使用的复用性
  • Plugins:完成模块功能的补充,包括连接插件、邮件插件等
  • Connection Plugins :连接管理主机的插件
    Inventory:定义 Ansible 管理主机的清单

ansible的特性

  • 高度模块化:调用特定的模块,完成特定的任务
  • 基于python语言实现
  • 部署简单:无需agent端,更轻量级 。
  • 支持playbook
  • 幂等性(多次运行结果一样)
  • 支持非root用户管理操作,支持sudo

ansible安装

环境:

操作系统

centos7.6

IP地址

  • ansible: 192.168.44.100
  • node1: 192.169.44.101

关闭ansible node1 node2 中的selinux firewalld以防后续干扰使用,如需启用,也可时候再行启动。

注:本次未使用到ansible的最新特性,仅使用yum的进行安装使用,如需要使用最新特性,请上官方网站上进行下载

安装

      yum -y install ansible   # 请提前配置好epel的yum源
      [root@ansible ~]# ansible --version  # 本次使用的ansible版本,截止到本次使用时ansible最新版本为2.8
        ansible 2.7.10
        config file = /etc/ansible/ansible.cfg  
        configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
        ansible python module location = /usr/lib/python2.7/site-packages/ansible
        executable location = /usr/bin/ansible
        python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

ansible的简单使用

使用前需要配置ansible主机可以直接免密登录被管理主机
配置主机清单
vim  /etc/ansible/hosts  # 本次使用的是yum安装,默认主机清单路径
  [node1]
  192.168.44.101
  1. 可以直接使用命令行工具 ansible
         ansible 主机地址or主机组名or all -m 模块名称-a 模块名称
     例:[root@ansible ~]#   ansible all -m ping 
             192.168.44.101 | SUCCESS => {
             "changed": false, 
             "ping": "pong"
             }
    
  2. ansible-doc
    ansible中有众多模块,可使用-l命令列出,使用-s查看模块的简要使用说明
[root@ansible ~]# ansible-doc -l 
a10_server                                           Manage A10 Networks AX/SoftAX/Th...
a10_server_axapi3                                    Manage A10 Networks AX/SoftAX/Th...
a10_service_group                                    Manage A10 Networks AX/SoftAX/Th...
a10_virtual_server                                   Manage A10 Networks AX/SoftAX/Th...
aci_aaa_user                                         Manage AAA users (aaa:User)     
aci_aaa_user_certificate                             Manage AAA user certificates (aa...
aci_access_port_to_interface_policy_leaf_profile     Manage Fabric interface policy l...
aci_aep                                              Manage attachable Access Entity ...
aci_aep_to_domain                                    Bind AEPs to Physical or Virtual...
aci_ap    
···                     
  1. ansible-playbook
    用于执行ansible的playbook的命令行工具
    playbook的核心元素
    • Hosts 用于执行的主机
    • tasks 主要任务
    • variables 将需要修改的配置抽取为变量,简化配置
    • templates 可以结合facts针对不同的应用场景进行自动修改生成所需的配置文件
    • handle 由特定条件出发的任务
    • roles 用于提高playbook的复用性

使用playbook进行lnmp的安装

v1本次使用yum进行nmp的安装,后续如果需要使用编译方式安装自行修改yaml文件即可
- hosts: node1
  remote_user: root
  tasks:
  - name: install {{ packages }}
    yum: name={{ packages }} state=installed
    vars:
      packages:
        - nginx
        - mariadb-server
        - php-fpm
  - name: create data dir
    command: mkdir -p /data/html
  - name: nginx template        
    template: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf      
  - name: php test page
    copy : src=/tmp/phptest.php dest=/data/html/    
    notify: restart nginx
  - name: start nginx,php-fpm,mariadb
    systemd: name={{ item }} state=started
    with_items:
    - nginx
    - php-fpm
    - mariadb
  handlers:
  - name: restart nginx
    systemd: name=nginx state=restarted

tmp下的两个文件

phptest.php


nginx.conf中的server段修改内容

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /data/html;
index index.php index.html index.htm;

    include /etc/nginx/default.d/*.conf;

    location / {
    }
location ~ .*\.*.(php|php5)$ {
   fastcgi_pass 127.0.0.1:9000; 
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include fastcgi_params;
}

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

报错及解决

第一次运行yaml文件时有一个警告

TASK [install {{ item }}] *********************************************************************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and 
specifying `name: "{{ item }}"`, please use `name: ['nginx', 'php-fpm', 'mariadb']` and remove the loop. This feature will be removed in version 2.11. 
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

是因为第一次使用了循环的方式进行安装,后续替换成了上面yaml中的形式后不在有警告,因为在2.7中不建议使用这种方式。

task was:

- name:  Install base packages
  apt:
    name:  "{{ item }}"
    state: present
    update_cache: yes
  with_items:
    - htop
    - zsh
    - s3cmd
Very standard.

The new style with Ansible 2.7 should look like:

- name:  Install base packages
  apt:
    name:  "{{ packages }}"
    state: present
    update_cache:  yes
  vars:
    packages:
      - htop
      - zsh
      - s3cmd

v2为提高playbook的可用性,可使用role的方式将playbook进行拆分,并在下次使用时可直接调用相关的yaml文件

Role的默认存放位置在/etc/ansible/roles

可通过修改配置文件修改role的存放位置
以特定的角色名命名目录,子目录命名规则

  • files 存放由copy或者script模块等调用的文件
  • templates template模块查找所需模板文件目录
  • tasks 至少应该包含一个名为main.yaml文件;其他文件需要在此文件中通过include 进行包含
  • handles 至少应该包含一个名为main.yaml文件,其他文件需要通过include进行包含
  • vars 至少应该包含一个名为main.yaml文件,其他文件需要通过include进行包含,格式 name:value
  • meta 至少应该应该包含一个名为main.yaml文件,其他文件通过include进行包含,定义当前角色的特殊设定及其依赖关系
  • default 设定默认变量时使用此目录中的main.yaml文件

子目录不一定需要都存在,需要哪一个创建哪一个

使用时写一个playbook将角色应用到主机上

- hosts: HOSTNAME
  remote_user: REMOTE_USER
  roles:
  - ROLER1
  - ROLER2
  ···

playbook

- hosts: node1
  remote_user: root
  roles:
  - install_lnmp

rolers

[root@ansible roles]# tree
.
└── install_lnmp
    ├── files
    │   └── phptest.php
    ├── handlers
    │   └── main.yaml
    ├── tasks
    │   └── main.yaml
    ├── templates
    │   └── nginx.conf
    └── vars
        └── main.yaml

[root@ansible install_lnmp]# cat handlers/main.yaml 
- name: restart nginx
  systemd: name=nginx state=restarted
[root@ansible install_lnmp]# cat tasks/main.yaml 
- name: install {{ packages }}
  yum: name={{ packages }} state=installed
- name: nginx template
  template: src=nginx.conf dest=/etc/nginx.conf
  notify: restart nginx
- name: create data dir
  shell: mkdir -p /data/html
- name: php_test page
  copy: src=phptest.php dest=/data/html
- name: start service
  systemd: name={{ item }} state=started
  with_items:
  - nginx
  - mariadb
  - php-fpm
[root@ansible install_lnmp]# cat vars/main.yaml 
packages:
- nginx
- php-fpm
- mariadb-server

你可能感兴趣的:(ansible--使用ansible进行lnmp环境部署)