如何具体运用Python中的Ansible模块编写Playbook?

2026-05-25 01:341阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1978个文字,预计阅读时间需要8分钟。

如何具体运用Python中的Ansible模块编写Playbook?

Playbook中,我们详细介绍了Ansible提供的一些常用模块。可以看到,Ansible中的每个模块都专注于某一方面的功能。虽然每个模块实现的功能相对简单,但将它们组合起来就能实现强大的自动化。

如何具体运用Python中的Ansible模块编写Playbook?

Playbook

在上一节中,我们详细介绍了Ansible提供的一些常用模块。可以看到,Ansible中的每个模块专注于某一方面的功能。虽然每个模块实现的功能都比较简单,但是,将各个模块组合起来就可以实现比较复杂的功能。在Ansible中,将各个模块组合起来的文件是一个YAML格式的配置文件。这个配置文件,在Ansible中称为Playbook。

在这一节中,我们将循序渐进地介绍Ansible中的Playbook,我们将首先介绍Playbook的定义,然后介绍如何使用Playbook完成远程服务器部署,之后详细介绍Playbook的基本语法,使用Playbook的基本讲法就能够完成大部分的部署任务。

在这一节中,找们将介绍如何使用Playbook的基本语法完成nginx与MongoDB的部署,最后,我们介绍了部分Playbook的高级语法。

1、Playbook的定义

Playbook不同于其他使用单个模块操作远程服务器,Playbook的功能更加强大。如果只使用Playbook的基本功能,那么,Playbook是一个非常简单的配、管理和部署系统。此外,Playbook也可以实现各种高级功能,如指定任务的执行顺序,委派其他主机来执行某一个任务,与监控服务器和负载均衡组件进行交互等。

有一个非常恰当的比喻,,Ansible中的模块类似于Linux下的命令,Ansible中的Playbook类似于Linux下的Shell脚本文件。Shell脚本文件将各个Linux命令组合起来,以此实现复杂的功能,Playbook将各个模块组合起来也可以实现复杂的部署功能。在shell脚本中,除了调用Linux命令以外,还有一些基本的语法,如变量定义、if语句、for循环等。在Playbook中,一方面通过YAML格式进行定义提高Playbook的可读性、可维护性,降低工程师的学习负担;另一方面,Ansible提供了若干可以应用在Playbook中的选项,以便工程师实现更加高级的功能。

一个Playbook可以包含一到多个Play,每一个Play是一个完整的部署任务。在Play中,我们需要指定对哪些远程服务器执行操作,以及对这些远程服务器执行哪些操作。

下面是一个名为first_playbook.yml的Playbook。在这个Playbook中,我们定义了两个Play,前者用来在数据库服务器上部署MongoDB,后者用来在web服务器上部署“应用”。这里只是为了对Playbook进行演示,并没有真的部署应用。

[root@python ~]# vim first_playbook.yml --- - hosts: dbservers become: yes become_method: sudo tasks: - name: install mongodb yum: name=mongodb-server state=present - hosts: webservers tasks: - name: copy file copy: src=/tmp/data.txt dest=/tmp/data.txt - name: change mode file: dest=/tmp/data.txt mode=655 owner=root group=root

这个Playbook中包含了两个Play。一个Playbook可以包含一到多个Play,所以即使Playbook中值包含一个Play,也需要使用列表的形式进行定义。在YAML语法中,“- hosts”前面的“-”表示定义列表。

在Ansible中,一个Play必须包含以下两项:

1. hosts:需要对哪些远程服务器执行操作
2. tasks:需要在这些服务器上执行的任务列表

例如,对web服务器进行部署时,我们仅仅使用了hosts和tasks两个选项。前者表示对哪些服务器执行操作,后者表示对服务器执行哪些操作。在部署数据库服务器时需要安装软件,因此使用了become与become_method两个选项,用来表示使用管理员的身份去安装MongoDB数据库。

一个Play可以包含一到多个task,因此task也必须以YAML的列表形式进行定义。可以看到,在这个例子中,对数据库服务器进行操作时仅包含了一个task,对web服务器进行部署时包含了两个task。

在Ansible中,task有两种定义形式:

1. action:module options

2. module:options

前一种形式是Ansible的旧版本语法,第2种形式是新版本的语法,直接使用模块的名称作为键,使用模块的参数作为值。如下所示:

- name: install github.com/lorin/ansible-quickref快速了解Play与task中的选项,以及各个选项的含义。

4、案例:使用Playbook部署nginx

wget -O /etc/yum.repos.d/epel.repo mirrors.aliyun.com/repo/epel-7.repo //下载源

在这个例子中,我们使用Ansible配置一台服务器运行nginx进程。部署nginx的Playbook如下:

--- - hosts: webservers become: yes become_method: sudo vars: worker_prosess: 4 worker_connections: 768 max_open_files: 65506 tasks: - name: install nginx yum: name=nginx update_cache=yes state=present - name: copy nginx config file template: src=/root/test_ansible/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx - name: copy index.html template: src: /root/test_ansible/index.html.j2 dest: /usr/share/nginx/www/index.html mode: 0644 notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted

在这个Playbook中,我们首先通过hosts选项指定了要对哪些远程服务器执行操作。随后,我们通过become与become_method选项声明了部署时使用sudo权限。接下来,我们在vars字段中定义了三个变量,这三个变量将用在nginx的配置文件中。我们在tasks选项下定义了部署nginx服务的任务列表,包括软件安装、模板渲染、定制s首页和重启nginx进程。

为了避免配置文件在没有任何修改的情况下重启了nginx进程,这里使用了Ansible的handler机制。在这个Playbook中,存在两个notify选项,以及一个handler选项。无论是nginx的配置文件,还是定制首页发生了修改,我们都会重启nginx进程。由于我们使用了Ansible的handlers机制,因此,在没有任何修改的情况下,Ansible并不会重启nginx进程。使用handler机制还有一个好处,notify多次,handler也只会执行一次,避免了反复多次重启nginx进程。

在这个部署nginx服务的Playbook中,我们用到了nginx.conf.j2这个配置模板。这个模板使用的是Jinja2的语法,所以后缀名为j2。模板的内容如下:

[root@python ~]# mkdir test_ansible [root@python ~]# vim /root/test_ansible/nginx.conf.j2 worker_processes {{ worker_prosess }}; worker_rlimit_nofile {{ max_open_files }}; events { worker_connections {{ worker_connections }}; } http { server { listen 80; listen 443 ssl; server_name localhost; location / { root /usr/share/nginx/www; index index.html index.htm; tr_files $uri $uri/ =404; } } }

Ansible会使用我们在Playbook的vars字段中定义的变量,将Jinja2模板渲染成真实的配置文件。

我们的Playbook还用到了一个名为index.html.j2的模板,该模板用于渲染网站首页。index.html.j2的内容如下:

[root@python ~]# vim /root/test_ansible/index.html.j2 <html> <meta charset="utf-8"> <head> <title>wellcome to ansible</title> </head> <body> <h1>nginx, configured by ansible</h1> <p>如果你能看到这个页面,说明ansible自动部署nginx成功了!</p> <p>{{ ansible_hostname }}<p> </body> </html>

在index.html.j2中,我们用到了一个名为ansible_hostname的变量。这个变量是Facts变量,是Ansible在执行Playbook之前从远程服务器获取到的信息。因此,我们不需要定义,直接使用即可。

有了Playbook以后,使用ansible-playbook命令进行部署。如下所示:

[root@python ~]# pip install Jinja2 [root@python ~]# vim /etc/ansible/ansible.cfg [defaults] inventory = /root/hosts [root@bogon ~]# ansible-playbook nginx.yml PLAY [webservers] ********************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************** ok: [127.0.0.1] TASK [install nginx] ******************************************************************************************************* ok: [127.0.0.1] TASK [copy nginx config file] ********************************************************************************************** ok: [127.0.0.1] TASK [copy index.html] ***************************************************************************************************** ok: [127.0.0.1] PLAY RECAP ***************************************************************************************************************** 127.0.0.1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@bogon ~]#

如果安装失败,可能是端口被占用,可以停止使用该端口的服务,或者更改nginx端口。

[root@bogon ~]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 7470/X tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 7654/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7337/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 7340/cupsd tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 31653/sshd: root@pt tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 31653/sshd: root@pt tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN 31653/sshd: root@pt tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 17867/httpd tcp6 0 0 :::6000 :::* LISTEN 7470/X tcp6 0 0 :::22 :::* LISTEN 7337/sshd tcp6 0 0 ::1:631 :::* LISTEN 7340/cupsd tcp6 0 0 ::1:6010 :::* LISTEN 31653/sshd: root@pt tcp6 0 0 ::1:6011 :::* LISTEN 31653/sshd: root@pt tcp6 0 0 ::1:6012 :::* LISTEN 31653/sshd: root@pt [root@bogon ~]# systemctl stop httpd.service

第二台服务器启动一下nginx

[root@192 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@192 ~]# nginx nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] still could not bind()

浏览器访问一下

到此这篇关于python中Ansible模块的Playbook的具体使用的文章就介绍到这了,更多相关python Ansible Playbook内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

标签:Playbook

本文共计1978个文字,预计阅读时间需要8分钟。

如何具体运用Python中的Ansible模块编写Playbook?

Playbook中,我们详细介绍了Ansible提供的一些常用模块。可以看到,Ansible中的每个模块都专注于某一方面的功能。虽然每个模块实现的功能相对简单,但将它们组合起来就能实现强大的自动化。

如何具体运用Python中的Ansible模块编写Playbook?

Playbook

在上一节中,我们详细介绍了Ansible提供的一些常用模块。可以看到,Ansible中的每个模块专注于某一方面的功能。虽然每个模块实现的功能都比较简单,但是,将各个模块组合起来就可以实现比较复杂的功能。在Ansible中,将各个模块组合起来的文件是一个YAML格式的配置文件。这个配置文件,在Ansible中称为Playbook。

在这一节中,我们将循序渐进地介绍Ansible中的Playbook,我们将首先介绍Playbook的定义,然后介绍如何使用Playbook完成远程服务器部署,之后详细介绍Playbook的基本语法,使用Playbook的基本讲法就能够完成大部分的部署任务。

在这一节中,找们将介绍如何使用Playbook的基本语法完成nginx与MongoDB的部署,最后,我们介绍了部分Playbook的高级语法。

1、Playbook的定义

Playbook不同于其他使用单个模块操作远程服务器,Playbook的功能更加强大。如果只使用Playbook的基本功能,那么,Playbook是一个非常简单的配、管理和部署系统。此外,Playbook也可以实现各种高级功能,如指定任务的执行顺序,委派其他主机来执行某一个任务,与监控服务器和负载均衡组件进行交互等。

有一个非常恰当的比喻,,Ansible中的模块类似于Linux下的命令,Ansible中的Playbook类似于Linux下的Shell脚本文件。Shell脚本文件将各个Linux命令组合起来,以此实现复杂的功能,Playbook将各个模块组合起来也可以实现复杂的部署功能。在shell脚本中,除了调用Linux命令以外,还有一些基本的语法,如变量定义、if语句、for循环等。在Playbook中,一方面通过YAML格式进行定义提高Playbook的可读性、可维护性,降低工程师的学习负担;另一方面,Ansible提供了若干可以应用在Playbook中的选项,以便工程师实现更加高级的功能。

一个Playbook可以包含一到多个Play,每一个Play是一个完整的部署任务。在Play中,我们需要指定对哪些远程服务器执行操作,以及对这些远程服务器执行哪些操作。

下面是一个名为first_playbook.yml的Playbook。在这个Playbook中,我们定义了两个Play,前者用来在数据库服务器上部署MongoDB,后者用来在web服务器上部署“应用”。这里只是为了对Playbook进行演示,并没有真的部署应用。

[root@python ~]# vim first_playbook.yml --- - hosts: dbservers become: yes become_method: sudo tasks: - name: install mongodb yum: name=mongodb-server state=present - hosts: webservers tasks: - name: copy file copy: src=/tmp/data.txt dest=/tmp/data.txt - name: change mode file: dest=/tmp/data.txt mode=655 owner=root group=root

这个Playbook中包含了两个Play。一个Playbook可以包含一到多个Play,所以即使Playbook中值包含一个Play,也需要使用列表的形式进行定义。在YAML语法中,“- hosts”前面的“-”表示定义列表。

在Ansible中,一个Play必须包含以下两项:

1. hosts:需要对哪些远程服务器执行操作
2. tasks:需要在这些服务器上执行的任务列表

例如,对web服务器进行部署时,我们仅仅使用了hosts和tasks两个选项。前者表示对哪些服务器执行操作,后者表示对服务器执行哪些操作。在部署数据库服务器时需要安装软件,因此使用了become与become_method两个选项,用来表示使用管理员的身份去安装MongoDB数据库。

一个Play可以包含一到多个task,因此task也必须以YAML的列表形式进行定义。可以看到,在这个例子中,对数据库服务器进行操作时仅包含了一个task,对web服务器进行部署时包含了两个task。

在Ansible中,task有两种定义形式:

1. action:module options

2. module:options

前一种形式是Ansible的旧版本语法,第2种形式是新版本的语法,直接使用模块的名称作为键,使用模块的参数作为值。如下所示:

- name: install github.com/lorin/ansible-quickref快速了解Play与task中的选项,以及各个选项的含义。

4、案例:使用Playbook部署nginx

wget -O /etc/yum.repos.d/epel.repo mirrors.aliyun.com/repo/epel-7.repo //下载源

在这个例子中,我们使用Ansible配置一台服务器运行nginx进程。部署nginx的Playbook如下:

--- - hosts: webservers become: yes become_method: sudo vars: worker_prosess: 4 worker_connections: 768 max_open_files: 65506 tasks: - name: install nginx yum: name=nginx update_cache=yes state=present - name: copy nginx config file template: src=/root/test_ansible/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx - name: copy index.html template: src: /root/test_ansible/index.html.j2 dest: /usr/share/nginx/www/index.html mode: 0644 notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted

在这个Playbook中,我们首先通过hosts选项指定了要对哪些远程服务器执行操作。随后,我们通过become与become_method选项声明了部署时使用sudo权限。接下来,我们在vars字段中定义了三个变量,这三个变量将用在nginx的配置文件中。我们在tasks选项下定义了部署nginx服务的任务列表,包括软件安装、模板渲染、定制s首页和重启nginx进程。

为了避免配置文件在没有任何修改的情况下重启了nginx进程,这里使用了Ansible的handler机制。在这个Playbook中,存在两个notify选项,以及一个handler选项。无论是nginx的配置文件,还是定制首页发生了修改,我们都会重启nginx进程。由于我们使用了Ansible的handlers机制,因此,在没有任何修改的情况下,Ansible并不会重启nginx进程。使用handler机制还有一个好处,notify多次,handler也只会执行一次,避免了反复多次重启nginx进程。

在这个部署nginx服务的Playbook中,我们用到了nginx.conf.j2这个配置模板。这个模板使用的是Jinja2的语法,所以后缀名为j2。模板的内容如下:

[root@python ~]# mkdir test_ansible [root@python ~]# vim /root/test_ansible/nginx.conf.j2 worker_processes {{ worker_prosess }}; worker_rlimit_nofile {{ max_open_files }}; events { worker_connections {{ worker_connections }}; } http { server { listen 80; listen 443 ssl; server_name localhost; location / { root /usr/share/nginx/www; index index.html index.htm; tr_files $uri $uri/ =404; } } }

Ansible会使用我们在Playbook的vars字段中定义的变量,将Jinja2模板渲染成真实的配置文件。

我们的Playbook还用到了一个名为index.html.j2的模板,该模板用于渲染网站首页。index.html.j2的内容如下:

[root@python ~]# vim /root/test_ansible/index.html.j2 <html> <meta charset="utf-8"> <head> <title>wellcome to ansible</title> </head> <body> <h1>nginx, configured by ansible</h1> <p>如果你能看到这个页面,说明ansible自动部署nginx成功了!</p> <p>{{ ansible_hostname }}<p> </body> </html>

在index.html.j2中,我们用到了一个名为ansible_hostname的变量。这个变量是Facts变量,是Ansible在执行Playbook之前从远程服务器获取到的信息。因此,我们不需要定义,直接使用即可。

有了Playbook以后,使用ansible-playbook命令进行部署。如下所示:

[root@python ~]# pip install Jinja2 [root@python ~]# vim /etc/ansible/ansible.cfg [defaults] inventory = /root/hosts [root@bogon ~]# ansible-playbook nginx.yml PLAY [webservers] ********************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************** ok: [127.0.0.1] TASK [install nginx] ******************************************************************************************************* ok: [127.0.0.1] TASK [copy nginx config file] ********************************************************************************************** ok: [127.0.0.1] TASK [copy index.html] ***************************************************************************************************** ok: [127.0.0.1] PLAY RECAP ***************************************************************************************************************** 127.0.0.1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@bogon ~]#

如果安装失败,可能是端口被占用,可以停止使用该端口的服务,或者更改nginx端口。

[root@bogon ~]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 7470/X tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 7654/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7337/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 7340/cupsd tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 31653/sshd: root@pt tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 31653/sshd: root@pt tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN 31653/sshd: root@pt tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 17867/httpd tcp6 0 0 :::6000 :::* LISTEN 7470/X tcp6 0 0 :::22 :::* LISTEN 7337/sshd tcp6 0 0 ::1:631 :::* LISTEN 7340/cupsd tcp6 0 0 ::1:6010 :::* LISTEN 31653/sshd: root@pt tcp6 0 0 ::1:6011 :::* LISTEN 31653/sshd: root@pt tcp6 0 0 ::1:6012 :::* LISTEN 31653/sshd: root@pt [root@bogon ~]# systemctl stop httpd.service

第二台服务器启动一下nginx

[root@192 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@192 ~]# nginx nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] still could not bind()

浏览器访问一下

到此这篇关于python中Ansible模块的Playbook的具体使用的文章就介绍到这了,更多相关python Ansible Playbook内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

标签:Playbook