小阿轩yx-案例:Ansible剧本文件实践

小阿轩yx-案例:Ansible剧本文件实践

Playbook 介绍

什么是 playbook

  • playbook 顾名思义,即剧本,现实生活中演员按照剧本表演
  • 在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。
  • playbook 是 ansible 用于配置,部署,和管理节点的剧本通过 playbook 的详细描述,执行其中的一些列 tasks,可以让远端的主机达到预期的状态。
  • playbook 就像 ansible 控制器给被控节点列出的一系列 to-do-list,而且被控节点必须要完成。

Ansible play 使用场景

  • 执行一些简单的任务,使用 ad-hoc 命令可以方便的解决问题,但有时一个设施过于复杂,需要大量的操作的时,执行的 ad-hoc 命令是不合适的,这时候最好使用 playbook。
  • 就像执行 shell 命令与写 shell 脚本一样,也可以理解为批处理任务,不过 playbook 有自己的语法格式使用 playbook 可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。
  • 使用 Ansible 的过程中,会发现,处理的大部分操作都是编写playbook。
  • 可以把常见的应用都编写为 playbook,之后管理服务器会变得很简单。

Playbook 的组成

  • 由一个或多个 "play" 组成的列表

主要功能

  • 通过将 task 定义好的角色归并为组进行统一管理
  • 也就是通过 Task 调用 Ansible 的模板将多个 "play" 组织在一个 Playbook 中运行

Playbook 本身由下面几部分组成

  • Tasks:任务,即调用模块完成的某操作;
  • Variables:变量;
  • Templates:模板;
  • Handlers:处理器,某条件满足时,触发执行的操作;
  • Roles:角色。

恢复上一章 Ansible 部署的快照

Playbook 的简单示例

复制代码
[root@ansible-node1 ~]# vi a.yml
---
- hosts: web
  remote user:root
  tasks :
    - name: create user
      user:
        name: zhangsan
        password: "{{ 'aptech' | password_hash('sha512') }}"
        state: present
      tags:
      - CCC
...

执行 playbook,进行语法检查

复制代码
[root@ansible-node1 ~]# ansible-playbook --syntax-check a.yml

预测试

复制代码
[root@ansible-node1 ~]# ansible-playbook -C a.ym1

列出主机

复制代码
[root@ansible-node1 ~]# ansible-playbook --list-hosts a.yml

列出任务

复制代码
[root@ansible-node1 ~]# ansible-playbook --list-tasks a.yml

列出标签

复制代码
[root@ansible-node1 ~]# ansible-playbook --list-tags a.yml

执行任务

复制代码
[root@ansible-node1 ~]# ansible-playbook a.yml

Hosts 和 Users 介绍

Playbook 的设计目的

  • 为了让某个或某些主机以某个用户身份去执行完成相应的任务。
  • 用于指定要执行指定任务的主机用 hosts 定义,可以是一个也可以是由冒号分隔的多个主机组;
  • 用于指定被管理主机上执行任务的用户用 remote user 来定义

如示例所示

复制代码
- hosts: web
  remote_user: zhangsan

remote_user 也可定义指定用户通过 sudo 的方法在被管理主机上运行指令, 甚至可以在使用sudo 时用 sudo user 指定 sudo 切换的用户。

复制代码
[root@ansible-node1 ~]# vim b.yaml
---
- hosts: web
  remote_user: zhangsan
  tasks:
    - name: test connection
      ping:
...

远程连接拷贝

复制代码
[root@ansible-node1 ~]# ssh-copy-id [email protected]

执行

复制代码
[root@ansible-node1 ~]# ansible-playbook b.yaml

任务列表和 action 介绍

  • "Play" 的主体是任务列表(Tasks list)。
  • 任务列表中的任务按照次序逐个在 hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务回滚。
  • 因此,需要在更正 Playbook 中的错误后重新执行这些任务。

Task 的任务

  • 按照指定的参数去执行模块。

  • 每个 task 使用 name 输出 Playbook 的运行结果一般输出内容为描述该任务执行的步骤。

  • 如果没有提供将输出 action 的运行结果。

  • 定义 task 的格式可以用 "action:module options" 或 "module:options" 都可,其中后者可以实现向后兼容。

  • 如果 action 的内容过多,可在行首使用空白字符进行换行。

    [root@ansible-node1 ~]# vi a.yml

    • hosts: web
      remote_user: root
      tasks:
      • name: create usen
        user:
        name: zhangsan
        password: "{{ 'aptech' | password_hash('sha512') }}"
        state: present
        tags:
    • hosts: db
      remote_user: root
      tasks:
      • name: copy file to web
        copy: src=/etc/passwd dest=/opt
        tags:
        • ddd
          ...
    • hosts: db
  • remote_user: root

  • tasks:

    • name: copy file to web
  • copy: src=/etc/passwd dest=/opt

  • tags:

    • ddd

执行

复制代码
[root@ansible-node1 ~]# ansible-playbook a.yml
  • 如果多次执行修改的 Playbook 时,涉及到一些没有变化的代码,可以使用 tages 让用户选择跳过没有变化代码,只运行 Playbook 中发生变化的部分代码。
  • 可以在 Paybook 中为某个或某些任务定义 "标签",在执行此 Playbook 时通过 ansible-playbook 命令的 --tags 选项能实现仅运行指定的 tasks 而非所有的 tasks。

Handlers 介绍

  • Handlers 用于当关注的资源发生变化时所采取的操作。
  • 在 notify 中列出的操作便称为 handler,也就是 notify 中需要调用 handler 中定义的操作。
  • 而 notify 这个动作用于在每个 "play" 的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。

拷贝模板文件为 /etc/foo.conf 文件时,重新启动 memcached 和 apache 服务

创建 conf 目录

复制代码
[root@ansible-node1 ~]# mkdir conf

安装 httpd

复制代码
[root@ansible-node1 ~]# yum -y install httpd

拷贝文件到指定目录下

复制代码
[root@ansible-node1 ~]# cp /etc/httpd/conf/httpd.conf conf

修改配置文件

复制代码
[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 8080 //修改端口号

编写配置文件

复制代码
[root@ansible-node1 ~]# vim a.yml
- host: web
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install configuration file or httpd
    copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd service
    service: enabled=true name=httpd state=started

执行

复制代码
[root@ansible-node1 ~]# ansible-playbook a.yml

登录被管理主机 ansible-node2

复制代码
[root@ansible-node2 ~]# rpm -qa httpd

查看执行结果

复制代码
[root@ansible-node2 ~]# grep "Listen" /etc/httpd/conf/httpd.conf | grep -v "#"

查看状态

复制代码
[root@ansible-node2 ~]# systemctl status httpd

设置 handlers

  • 如果配置文件有改动
  • 如:Apache 端口号改变,则需要定义 notify 和 handlers,触发更新相关执行操作。

修改端口号

复制代码
[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 808

编写文件

复制代码
[root@ansible-node1 ~]# vim b.yml
---
- hosts: web
  remote_user: root
  tasks:
    - name: change port
      copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:
        - restart httpd server
  handlers:
    - name: restart httpd server
      service: name=httpd state=restarted
...

执行

复制代码
[root@ansible-node1 ~]# ansible-playbook b.yml

node2 上要关闭 selinux,否则,同步配置会出错

登录被管理主机 ansible-node2 进行查看

复制代码
[root@ansible-node2 ~]# netstat -anpt | grep httpd

Templates 介绍

  • Jinja 是基于 Python 的模板引擎。
  • Template 类似 Jinja 的另一个重要组件,可以看作是一个编译过的模板文件。
  • 用来产生目标文本,传递 Python 的变量给模板去替换模板中的标记。

创建 templates 目录

复制代码
[root@ansible-node1 ~]# mkdir templates

拷贝文件到指定目录下

复制代码
[root@ansible-node1 ~]# cp conf/httpd.conf templates/httpd.conf.j2

创建模板文件

复制代码
[root@ansible-node1 ~]# vim templates/httpd.conf.j2
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}

为远程主机添加变量

复制代码
[root@ansible-node1 ~]# vim /etc/ansible/hosts
[web]
192.168.10.102 http_port=8888
[db]
192.168.10.103
  • http_port=8888

编写 playbook 文件

复制代码
[root@ansible-node1 ~]# vim apache.yml
- hosts: web
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{ package }} state=latest
  - name: install configuration file for httpd
    template: src=/root/templates/httpd.conf,i2 dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: enabled=true name={{ service }} state=started
  handlers:
  - name: restart httpd
    service: name={{ service }} state=restarted
    • restart httpd
    • name: restart httpd

执行

复制代码
[root@ansible-node1 ~]# ansible-playbook apache.yml

登录被管理主机 ansible-node2, 执行查看命令

复制代码
[root@ansible-node2 ~]# grep -i listen /etc/httpd/conf/httpd.conf | grep -v "#"
[root@ansible-node2 ~]# grep -i servername /etc/httpd/conf/httpd.conf | grep -v "#"

Roles 介绍

什么是 Roles

  • Ansible 为了层次化、结构化地组织 Playbook,使用了角色(roles),可以根据层次结构自动装载变量文件、tasks 以及 handlers 等。
  • 只需要在 Playbook 中使用 include 指令便可使用 roles。
  • 简单来讲, roles 就是分别将变量、文件、任务、模块及处理器设置于单独的目录中,便捷地使用它们。

利用 Roles 部署 mariadb

被管理主机配置 yum 源

配置数据库角色

复制代码
[root@node1 ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已创建目录 "/etc/ansible/roles/mariadb"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"

进入 tasks 目录

复制代码
[root@node1 ~]# cd /etc/ansible/roles/mariadb/tasks/

编写主文件

复制代码
[root@nodel tasks]# vi main.yml
---
- name: install mariadb
  yum: name=mariadb-server state=present
- name: install MySOL-python
  yum: name=MySOL-python state=present
- name: move config mariadb
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
  copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb
  shell: systemctl restart mariadb
- name: create database testdb
  shell: mysql -u roote -e "create database testdb;grant all on testdb.* to test'@'192.168.10.%' identified by 'test123';flush privileges;
  notify:
  - restart mariadb
...

切换至 handlers 目录

复制代码
[root@node1 tasks]# cd /etc/ansible/roles/mariadb/handlers

编写触发器文件

复制代码
[root@localhost handlers]# vi main.yml
---
- name:restart mariadb
  service: name=mariadb state=restarted
...

切换至 files 目录

复制代码
[root@nodel tasks]# cd /etc/ansible/roles/mariadb/files

查看

复制代码
[root@node1 files]# ls
my.cnf    ##将编辑好的 my.cnf 文件拷贝在此处

切换至 ansible 目录

复制代码
[root@node1 files]# cd /etc/ansible

编写角色文件

复制代码
[root@nodel ansible]# vi mariadb.yml
---
- hosts: db
  remote_user: root
  roles:
  - mariadb
...

测试角色文件

复制代码
[root@nodel ansible]# ansible-playbook --syntax-check mariadb.yml

执行 yml 文件

复制代码
[root@nodel ansible]# ansible-playbook mariadb.yml

检查远程服务器上数据库

  • 查看数据库信息,看看有没有创建制定的数据库

利用 Ansible 管理数据库

用 ansible 查看数据库

复制代码
[root@localhost ~]# ansible db -m shell -a 'mysql -u root -e "show databases;"'
192.168.10.103 | SUCCESS >> Database
information_schema
mysql
performance_schema
test
testdb

创建账户并授权

复制代码
[root@localhost ~]# ansible db -m yum -a "name=MySQL-python state=present"

[root@localhost ~]# ansible db -m mysql_user -a "name=zhangsan password=pwd123 host=192.168.10.% priv=*.*:ALL"

[root@localhost ~]# ansible db -m mysql_user -a "name=lisi password=pwd123 priv=*.*:ALL"
  • 张三能够远程登录,但李四不能
  • 要想使用 mysql_user 模块,需要在客户端安装MySQL-python,安装时注意大小写

为老用户授权(语法和创建用户并授权的语法是相同的)

复制代码
[root@localhost ~]# ansible db -m mysql_user -a "name=root password=pwd123 host=192.168.10.% priv=*.*:ALL"

小阿轩yx-案例:Ansible剧本文件实践

相关推荐
xq5148632 小时前
Linux系统下安装mongodb
linux·mongodb
柒七爱吃麻辣烫2 小时前
在Linux中安装JDK并且搭建Java环境
java·linux·开发语言
孤寂大仙v2 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
深海蜗牛2 小时前
Jenkins linux安装
linux·jenkins
愚戏师3 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
JANYI20183 小时前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
熊大如如3 小时前
Java NIO 文件处理接口
java·linux·nio
晚秋大魔王4 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
linux·开源·harmonyos
农民小飞侠4 小时前
ubuntu 24.04 error: cannot uninstall blinker 1.7.0, record file not found. hint
linux·运维·ubuntu
某不知名網友4 小时前
Linux 软硬连接详解
linux·运维·服务器