• Ansible自动化部署工具-组件及语法介绍


    大家好,我是蓝胖子,我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化,代码化,这样在以后执行类似的操作的时候就可以解放双手了,让程序自动完成。避免出错,Ansible就是这方面非常好用的工具。它能将我们的安装软件,部署等过程进行代码编排,程序化我们的部署步骤。今天,我们就来看看它的工作模式以及编排的语法规则。

    架构介绍#

    Ansible 与主机之间沟通的模式是通过ssh协议,执行相关的命令。这其中涉及到Ansible 的组成架构的问题,学习一门技术或工具首先得对它的架构有所了解。 我们来看看Ansible的组成架构是什么样的。

    组成架构#

    inventory主机清单#

    inventory清单定义了 Ansible 要管理的主机,当执行Ansible 任务时,需要指定主机清单,默认的主机清单配置是在/etc/ansible/hosts 里,执行命令的时候也可以通过-i 参数指定主机清单的位置。

    主机清单的配置文件是INI格式的文件,如下所示, 我配置了一个叫test的机器组,它又两个机器,分别是159.138.99.123,159.138.99.121,同时可以通过[组名:vars]的形式在下面定义特点组名的变量,下面👇🏻 示例的配置文件 我就定义了两个变量ansible_ssh_private_key_file代表连接服务器时使用的密钥的位置,ansible_ssh_user代表连接服务器时的用户名。

    [test]  
    159.138.99.123
    159.138.99.121
    [test:vars]  
    ansible_ssh_private_key_file=/Users/xiongchuanhong/.ssh/id_rsa  
    ansible_ssh_user=webserver
    

    inventory 中的常用变量如下:

    ansible_ssh_port: //定义连接主机的ssh端口 
    ansible_ssh_user: //定义连接到该主机的ssh用户 
    ansible_ssh_pass: //定义连接到该主机的ssh密码 
    ansible_sudo_pass: //定义sudo的密码 
    ansible_connection: //定义ansibles的连接类型,可以是local、ssh或paramiko ansible_ssh_private_key_file: //定义私钥文件路径
    

    平时使用inventory组件时,我们可以在一个文件夹下创建不同的机器组,如下,我创建了一个hosts文件夹,并且新建了两个文件分别存放 生产环境的机器组和测试环境的机器组。文件的格式是INI格式。

    (base) ➜  hosts tree .
    .
    ├── prod
    └── test
    
    

    接着我们可以使用如下命令测试定义的机器组是否有效,-i 后接文件名或文件夹名,然后是机器组的名称,这里是test。如果inventory配置正确,那么会出现对应机器组的ip。

    (base) ➜  hosts ansible -i test   test  --list-hosts
      hosts (1):
        159.138.99.123
    	159.138.99.121
    
    

    Ansible 核心组件#

    我将Ad-hoc组件和playbook,role这些组件都称为核心组件,因为它们对部署任务的编排有非常紧密的联系。在后面我会介绍它们比较详细的语法,这里就简单的提及一下它们之间的区别。

    Ad-hoc 命令是直接使用命令行来执行Ansible的任务,命令行也能使用Ansible的模块,如下Ad-hoc命令 使用copy模块复制文件,-m 后面跟的是模块名称,-a后面跟的是模块需要执行的命令。

    ansible <机器组名称> -m copy -a "src=/path/to/local/file dest=/path/to/remote/file" 
    

    📢📢 注意下,这里说的组件和模块的区别,在Ansible中封装了很多模块来方便我们完成对应的功能,可以用ansible-doc -l 去查看一共有哪些模块,关于模块的用法可以查看文档https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 文档记录了ansible内置的模块已经用法。

    playbook 适用于完成一些复杂的配置部署任务,虽然Ad-hoc能完成部分配置任务,但毕竟是命令行,playbook可以将配置任务文档化。如下通过在一个yaml文件里定义任务的执行步骤,然后用ansible-playbook 命令便可以执行site.yml 里配置的任务了。-i参数指定了inventory主机清单的位置。关于playbook的yml文件的语法会在接下来语法介绍时详细阐述。

    ansible-playbook site.yml -i hosts/prolinkbox
    

    role 组件针对于playbook编排任务的方式就更进一步,如果有很多不同业务需要编排部署任务,就会产生很多playbook的yml文件,不好维护。所以通过role组件定义了一些固定的目录规范存放任务相关的文件,涉及到任务编排的yml语法和playbook类似,基本没有变动。

    各种插件#

    除了上述提到的组件外,Ansible还有很多插件来让Ansible额外完成某些功能,比如日志,邮件功能,另外,Ansible默认的连接主机的方式是ssh,可以通过连接插件来来支持其他的连接方式。

    至此,大致介绍了完了Ansible的组成架构,接着我们详细看下Ansible编排任务的语法是怎么样的,了解了语法后,便可以自己编写Ansible的任务了。

    语法介绍#

    Ad-hoc临时命令模式#

    虽然我是极力建议使用Ansible编写对线上服务的部署任务时,尽量采用playbook方式,这样能文档化任务。但是一些简单的命令又想批量的在主机上运行,还是可以用到Ad-hoc方式执行。

    我们简单的看看其使用规则,-m 参数 指定使用的模块,-a 参数指定模块使用到的命令。举几个简单的例子,

    使用了shell模块,输出test机器组中每个linux服务器的主机名

    (base) ➜  boxdev ansible  -i hosts test -m shell -a 'hostname'  
    159.138.99.123 | CHANGED | rc=0 >>
    hw-sg1-test-0001
    
    

    使用了copy模块将本地的ReadMe.md 文件复制到了远程

    (base) ➜  boxdev ansible  -i hosts test -m copy  -a "dest=./ReadMe.md mode=600  src=./ReadMe.md" 
    
    159.138.99.123 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": true,
        "checksum": "73072172dcf3a9e8fd75b72a96d859240c65a26f",
        "dest": "./ReadMe.md",
        "gid": 1001,
        "group": "nemo",
        "mode": "0600",
        "owner": "webserver",
        "path": "./ReadMe.md",
        "size": 119,
        "state": "file",
        "uid": 1002
    }
    
    

    Ad-hoc 的使用十分简单,关键都是要掌握Ansible中有哪些模块,各个模块能有哪些参数,具体参考文档 https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin

    playbook编排模式#

    接下来,来看下playbook使用yml编排任务时的语法规则。如下是一个yml的示例文件,

    ---
    - hosts: all
      tasks:
        - name: Install Nginx Package
          yum: name=nginx state=present
    
        - name: Copy Nginx.conf
          template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf
    owner=root group=root mode=0644 validate=' nginx -t -c %s'
    	  notify:
    		- ReStart Nginx Service
    
       handlers:
    	   - name: ReStart Nginx Service
    		 service: name=nginx state=restarted
    
    

    上面这个文件足以介绍playbook的基础语法了首先hosts代表使用到的机器组,all代表主机清单上全部的机器组。

    tasks下面定义的是Ansible需要执行的任务,name代表人物的名称,接着就是Ansible的一些模块,像上面例子中就用到了yum模块,template模块。模块的用法以及需要定义哪些参数和使用Ad-hoc命令时一致。

    在任务后面还可以跟notify 配置,它代表在该任务完成后可以执行的额外操作,操作定义在handlers里,如上面例子那样,在Copy Nginx.conf任务完成后,执行了ReStart Nginx Service的handler,这个handler被定义在下面handlers的配置里,也是引用Ansible的模块的方式,使用了service模块启动nginx服务。

    总结#

    你可以发现,其实用上Ansible并不难,关键就是熟练的掌握各种模块的用法,无她,唯手熟尔。关于playbook的语法还涉及到参数定义,role模式的写法,这些详细的语法会放到后面的章节在继续讲解,这一节先简单的知道Ansible是个什么东西,能看懂很简单的playbook配置文件即可。

  • 相关阅读:
    我的设计模式之旅、09 工厂方法、简单工厂
    全志R128应用开发案例——SPI 驱动 TFT LCD 屏
    学习笔记4--自动驾驶汽车感知系统
    RESTful 分享
    Centos云服务器安装jdk1.8.0_191
    【SpringBoot】| Thymeleaf 模板引擎
    【优化充电】粒子群算法电动汽车充电动态优化策略【含Matlab源码 2163期】
    PyEMD安装过程
    MySQL总结(一)
    LDAP的理解
  • 原文地址:https://www.cnblogs.com/hobbybear/p/17819628.html