6

Ansible自动化部署工具-组件及语法介绍 - 蓝胖子的编程梦

 10 months ago
source link: https://www.cnblogs.com/hobbybear/p/17819628.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大家好,我是蓝胖子,我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化,代码化,这样在以后执行类似的操作的时候就可以解放双手了,让程序自动完成。避免出错,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配置文件即可。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK