ansible自动化运维

1、ansble介绍

        ansble为一款批量化处理系统配置的服务,对批量化系统部署、批量程序部署、批量运行命令、批量修改服务、批量安装软件包、批量修改配置等诸多功能。ansible基于SSH架构,含有丰富的模块,支持win、路由器、交换机远程操作。

        查看playbook的网址:https://galaxy.ansible.com

2、ansble部署

  • 环境准备

ansible:192.168.4.10

node01:192.168.4.21

node02:192.168.4.22

node03:192.168.4.23

2.1、ansible管理端部署

2.1.1、hosts文件配置

[root@ansible ~]# vim /etc/hosts
192.168.4.10 ansible
192.168.4.21 node01
192.168.4.22 node02
192.168.4.23 node03

2.1.2、创建密钥并传送每个节点

[root@ansible ~]# ssh-keygen
[root@ansible ~]# for i in 192.168.4.{21,22,23}; do ssh-copy-id $i; done

 2.1.3、安装ansible

[root@ansible ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@ansible ~]# yum -y install ansible

 2.1.4、ansible的管理文件

[root@ansible ansible]# cd /etc/ansible/
[root@ansible ansible]# tree
.
├── ansible.cfg
├── hosts
└── roles

[root@ansible ansible]# vim ansible.cfg 
 10 [defaults]
 11 deprecation_warnings = False        # 关闭红色警告消息
 14 inventory = /etc/ansible/hosts      # 清单文件,存放ansible管理的计算节点信息

 2.1.5、清单文件

[root@ansible ansible]# vim hosts
 44 [test]                           # 定义主机组
 45 node01                           # 定义主机组包含的具体主机
 46 [proxy]
 47 node02
 48 [webserver]
 49 node[02:03]
 50 [cluster:children]               # 嵌套组(chileren为关键字)
 51 proxy                            # 嵌套组中包含其它组
 52 webserver

2.1.6、验证

[root@ansible ansible]# ansible node01 -m ping  # node01按主机名,-m调用模块
node01 | SUCCESS => {                           # SUCCESS单词代表成功
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@ansible ansible]# ansible test -m ping    # test按主机组
[root@ansible ansible]# ansible all -m ping     # all所有主机

2.1.7、ansible_facts用于采集被管理设备的系统信息 

[root@ansible ansible]# ansible node01 -m setup

2.1.8、输出

        剧本运行时会列出每个任务和执行结果。ok 代表任务管理的机器状态已经完成,因为在任务中定义的状态已经为真,所以 Ansible 不需要执行任何操作。changed 表示 Ansible 已经执行了指定的任务。在这种情况下,任务中定义的机器状态不为真,所以执行指定的操作使其为真。在彩色终端上,TASK 行会以彩色显示。我的终端配色为“amber-on-black”,TASK 行显示为琥珀色,changed 是棕色,ok 为绿色,错误是红色。

3、ansible用法

        通过命令执行ansible,格式:ansible 目标主机或组 -m 模块 -a 参数

3.1、查询

[root@ansible ~]# ansible-doc -l          # 查看ansible支持的所有模块
[root@ansible ~]# ansible-doc ping        # 查看ping模板的详细用法

3.2、常用的模块

名称 作                     用
ping 用ansible主机ssh远程被管理主机,检查对方是否有python
command 默认模块,可以省略不写,作用是传命令给被控制端主机,在被控制端主机执行这个命令。变量是不可用的,还有像<>|;&都将不可用。
shell 可以让命令传给被控制端主机,在被控制端主机执行这个命令
script 把脚本拷贝给所有被管理主机,在被管理主机执行脚本
file

创建文件、创建目录、修改文件权限,所有者、所属组、删除文件、删除目录、创建文件的链接

copy 可以把控制端的文件拷贝给被控制端主机
fetch 可以把被控制端的文件拷贝给控制端主机
lineinfile 修改文件内容,一次修改文件的一行(以行为单位)
replace 修改文件内容,一次修改文件一个字符(以字符或单词为单位)
user 创建用户,配置用户信息(uid,组,密码,登录shell,家目录等),删除用户
yum_repository 可以修改/etc/yum.repos.d目录下的YUM配置文件
yum 安装软件,卸载软件,升级软件
service 管理服务,启动服务,关闭服务,重启服务,设置开机自启动
lvg 创建卷组
lvol 创建逻辑卷

注意!!!

  • CentOS7,CentOS8,RHEL7,RHEL8系统默认都是要求用户的密码使用sha512加密

4、Playbook剧本

  • 使用ansible有两种方法:

        ansible-adhoc:ansible-adhoc是通过命令行自动化管理服务器,但是不适合批量复杂的操作

        playbook【剧本】:重复的,复杂的任务,可以提前写到剧本里面,以后随时可以执行剧本

4.1、Playbook剧本的YAML格式要求:

  • 使用:代表kv(keyundefinedvalue键值对),:后面必须有空格
  • 使用-代表数组,-后面必须有空格
  • 缩进代表层级关系,缩进推荐使用2个空格,缩进必须对齐
  • 全文不能使用tab键
  • 区分字母的大小写
  • YAML文件的扩展名一般为.yaml或者.yml
  • YAML文件的第一行是--- (不是必须的undefined三个-只是给人看)
  • 跨行数据需要使用>或者|,其中|会保留换行符

4.2、Playbook常用的语法

  • hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组。
  • remote_user: 用于指定远程主机上的执行任务的用户。
- hosts: test	
  remote_user: root	
  • tasks: 任务列表, 按顺序执行任务。
tasks:
  - name: create user use variable
    user: name={{user}} state=present

  - name: install httpd server
    yum: name=httpd state=latest name=httpd-devel state=latest

  - name: start httpd service
    service: name=httpd state=started enabled=yes

  - name: copy httpd.conf to group1:/etc/httpd/conf/
    copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
  • handlers: 类似task,但需要使用notify通知调用,实现按需调用。
    notify:
    - restart httpd service
    
  handlers:
    - name: restart httpd service
      service: name=httpd state=restarted

        不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次。handlers最佳的应用场景是用来重启服务,或者触发系统重启操作,除此以外很少用到了。

        注意: handlers 需要notify调用,他和tasks不同的是 tasks每次都会调用,heandlers触发才调用,比如配置文件修改了,在执行playbook的时候,就会将管理机上的新改的copy到被管理机,那么就会触发headlers重启服务,否则不会执行heanlers

  • variables: 变量,定义变量可以被多次方便调用
vars:
    - user: ansible
  • with_items: 迭代列表

        其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。

yum: name={{item}} state=latest
with_items:
  - httpd
  - httpd-devel
  • ignore_errors:忽略错误

        默认ansible在遇到error会立刻停止,则不再往下执行。如果希望它还能继续往下执行,则需要添加ignore_errors: yes。放在hosts下面就是设置全局,这样下面任何任务失败都忽略

---
- hosts: node1
  tasks:
    - service:
        name: hehe
        state: started
      ignore_errors: yes
    - file:
        path: /tmp/service.txt
        state: touch
  • when:条件判断,当满足条件再执行任务

        案例:内存小于100M,则关闭计划任务

---
- hosts: node1
  tasks:
    - service:
        name: crond
        state: stopped
      when: ansible_memfree_mb < 100
  • block:语句块,这里是任务块

        案例:当系统为RedHat,则执行block的任务块

---
- hosts: node1
  tasks:
    - block:
        - yum:
            name: httpd
        - service:
            name: httpd
            state: started
      when: ansible_distribution == "RedHat"
  • block、rescue、always
  • block:定义一定执行的任务
  • rescue:救援,定义的任务只有在block失败时才执行(B计划undefined备胎)
  • always:定义总是要执行的任务,不管block|rescue是否成功都执行always里面的任务
---
- hosts: node01
  tasks:
    - block:
        - file:
            name: /tmp/xyz/file1.txt
            state: touch
      rescue:
        - file:
            name: /tmp/file2.txt
            state: touch
      always:
        - file:
            name: /tmp/file3.txt
            state: touch
  • loop:循环
---
- hosts: node01
  tasks:
    - user:
        name: "{{item.iname}}"
        password: "{{item.ipass | password_hash('sha512')}}"
      loop:
        - { iname: 'tom' , ipass: '123456' }
        - { iname: 'jerry' , ipass: '654321' }

5、Ansible Role

5.1、roles介绍

        把ansible需要做的任务以及相关素材,放到一个目录下,这个目录就是role(角色)

        roles: ansible模块,类似于函数,完成一个任务的指令。每一个roles都有自己特定的目录结构,就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。

5.1.1、roles的目录结构

role目录要求有子目录子目录的名称和作用是红帽定义死的,不可改变!

  • defualts/main.yml:定义变量的缺省值,优先级较低

  • files目录:存储静态文件的目录,如tar包、音乐、视频等

  • handlers/main.yml:定义handlers

  • meta/main.yml:写作者、版本等描述信息

  • README.md:整个角色(role)的描述信息

  • tasks/main.ym:定义各tasks任务的地方

  • templates目录:存放动态数据文件的地方(文件中包含了变量的模板文件)

  • vars/main.yml:定义变量,优先级高

注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.

5.2、通过roles实现lamp

        分析:假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。

5.2.1、roles目录下创建角色

       需定制三个角色: httpd、mysql、php,ansible默认角色必须放在ansible里面的roles目录

5.2.2、创建httpd角色

[root@ansible ansible]# ansible-galaxy init roles/httpd
- Role /etc/ansible/roles/httpd was created successfully
[root@ansible ansible]# ls roles/httpd/
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars
  • 编写httpd角色的main.yml文件
[root@ansible ansible]# ls roles/httpd/files/
httpd.conf  phpinfo.php

[root@ansible ansible]# vim roles/httpd/tasks/main.yml 

---
# tasks file for /etc/ansible/roles/httpd
- name: httpd httpd-devel httpd-manual软件安装
  yum: name={{item}} state=latest
  with_items:
    - httpd
    - httpd-devel
    - httpd-manual
---
# tasks file for /etc/ansible/roles/httpd
- name: httpd httpd-devel httpd-manual软件安装
  yum: name={{item}} state=latest
  with_items:
    - httpd
    - httpd-devel
    - httpd-manual

- name: 创建apache管理用户www
  user: name={{item}} state=present

- name: 设置apache开机启动,并启动服务
  service: name=httpd enabled=yes state=started

- name: 拷贝配置文件,初始化业务
  copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
  # 定义通知调用,当配置文件更新,需要重启服务
  notify:
    - restart apache

- name: 拷贝php测试页面
  copy: src=/etc/ansible/roles/httpd/files/phpinfo.php dest=/var/www/html/

[root@ansible ansible]# vim roles/httpd/vars/main.yml 
---
# vars file for /etc/ansible/roles/httpd
user: www

5.2.3、创建mysql角色

[root@ansible ansible]# ansible-galaxy init roles/mysql
- Role /etc/ansible/roles/mysql was created successfully
[root@ansible ansible]# ls roles/mysql/
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars
  • 编写mysql角色的main.yml文件
[root@ansible ansible]# vim roles/mysql/tasks/main.yml 
---
# tasks file for /etc/ansible/roles/mysql
- name: mysql用户创建
  user: name={{user}} state=present

- name: mysql软件安装
  yum: name={{item}} state=latest
  with_items:
    - mariadb
    - mariadb-server

- name: 启动服务,并设置开机启动
  service: name=mariadb enabled=yes state=started

- name: 改变mysql文件的所有者为mysql
  file: path='/usr/lib/mysql' owner={{user}} group={{user}} recurse=yes

[root@ansible ansible]# vim roles/mysql/vars/main.yml 
---
# vars file for /etc/ansible/roles/mysql
user: mysql

5.2.3、创建php角色

[root@ansible ansible]# ansible-galaxy init roles/php
- Role roles/php was created successfully
[root@ansible ansible]# ls roles/php/
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars
  • 编写php角色的main.yml文件
[root@ansible ansible]# ls roles/php/files/
www.conf
[root@ansible ansible]# vim roles/php/tasks/main.yml 
---
# tasks file for roles/php
- name: 安装php
  yum: name={{item}} state=latest
  with_items:
    - php
    - php-mysqlnd
    - php-gd
    - php- ldap
    - php-odbc
    - php-pear
    - php-xml
    - php-xmlrpc
    - php-mbstring
    - php-snmp
    - php-soap
    - curl
    - curl-devel
    - php-bcmath
    - php-fpm

- name: copy www.conf to /etc/php-fpm.d
  copy: src=/etc/ansible/roles/php/files/www.conf dest=/etc/php-fpm.d force=yes
  notify:
    - restart php-fpm

[root@ansible ansible]# vim roles/php/handlers/main.yml 
---
# handlers file for roles/php
- name: restart php-fpm
  service: name=php-fpm state=restarted                                           

5.2.4、编写lamp的playbook文件调用前面定义好的三个角色

[root@ansible ansible]# vim lamp.yml
---
- hosts: node01
  remote_user: root
  roles:
    - httpd
    - mysql
    - php
  • 执行lamp的playbook文件

[root@ansible ansible]# ansible-playbook lamp.yml 

你可能感兴趣的:(自动化运维,运维,ansible,自动化)