上篇介绍了 Ansible 单模块(AD-Hoc)的相关内容Ansible自动化运维Inventory与Ad-Hoc-CSDN博客,Ad-Hoc 命令是一次性的、即时执行的命令,用于在远程主机上执行特定任务,这些命令通常用于快速执行简单的任务。当需要在执行多个任务、配置复杂场景或需要可重复使用操作时,就需要用到任务剧本(Playbook)来定义复杂的任务流程和处理重复执行的操作。
目录
YAML(YAML Ain't Markup Language) 是一种人类可读的数据序列化格式,常用于配置文件和数据传输。它以缩进、换行和符号结构来表示数据,具有简洁、清晰的特点。YAML 旨在成为一个易于阅读和编写的数据格式,同时也适合机器解析和生成。它使用空格缩进来表示层级关系,不需要显式的标记符号(如 XML 或 JSON 中的尖括号或大括号),这使得它更加直观和易读。
YAML 官方网站:The Official YAML Web Site
Ansible 官网:YAML Syntax — Ansible Documentation
① YAML 在 Ansible 中的作用是提供了一种直观、易读的方式来表示配置信息和数据结构,从而使得管理和维护基础设施的自动化过程更加高效和直观。
② Ansible 将 YAML 作为其主要的配置文件格式,因此使用 YAML 可以方便地定义主机、角色、任务和变量。这使得 Ansible Playbook 和其他配置文件变得直观且易于编写。
在 YAML 中,列表使用短横线 - 表示,后面跟着一个空格。列表可以包含任意类型的元素,例如字符串、数字、布尔值或者其他嵌套的列表。
- fruits:
- - Apple
- - Orange
- - Strawberry
- - Mango
在这个例子中,fruits 是一个包含四种水果的列表,每一种水果都是列表中的一个元素。
字典在 YAML 中使用键值对的形式表示,使用冒号 : 将键和值分隔开,键值之间需要有一个空格。字典可以包含嵌套的字典或者列表作为值。
- person:
- name: John
- age: 30
- hobbies:
- - Reading
- - Hiking
- address:
- city: New York
- zip: 10001
在这个例子中,person 是一个字典,包含了名字、年龄以及兴趣爱好和地址等信息。
在 Ansible Playbooks 中,列表和字典通常用来定义变量、任务、主机清单等信息。它们提供了一种直观且易读的方式来表示复杂的数据结构,使得编写和维护 Playbooks 更加方便和直观。
批量安装apache
① 准备工作,卸载目标主机网站服务
- 管理节点:
- [root@ansible ~]# ansible all -m yum -a "name=httpd state=removed"
- #在Ansible中,all是一个用于指代所有主机的特殊关键字。当你在使用Ansible命令时,使用all会将命令应用到所有已定义的主机上。卸载httpd相关服务。
-
- 被管理节点:
- [root@localhost ~]# yum list | grep httpd | grep @
- httpd-tools.x86_64 2.4.6-99.el7.centos.1 @updates
- #检查是否还有安装httpd相关包。
-
- 管理节点:
- [root@ansible ~]# ansible all -m yum -a "name=httpd-tools state=removed"
- #卸载httpd工具包,避免影响安装httpd。
-
- 管理节点:
- [root@ansible ~]# yum install -y httpd
- #Ansible服务器安装网站服务
- [root@ansible ~]# mkdir apache
- [root@ansible ~]# cd apache/
- [root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .
② 编写剧本
- [root@ansible apache]# vim apache.yaml
- - hosts: webserver #针对的剧本对象
- tasks: #任务
- - name: install apache packages #任务1:安装apache包(可以自定义)
- yum: name=httpd state=present #调用yum安装模块:httpd,present,表示确保软件包已经安装
- - name: copy apache conf #任务2:拷贝apache配置文件
- copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf #调用拷贝模块,源——>目标
- - name: ensure apache is running #确保apache服务已运行
- service: name=httpd state=started enabled=yes #调用系统服务状态模块
③ 检查测试
- [root@ansible apache]# ansible-playbook apache.yaml --syntax-check #检验语法
-
- playbook: apache.yaml
- [root@ansible apache]# ansible-playbook apache.yaml --list-tasks #列出任务
-
- playbook: apache.yaml
-
- play #1 (webserver): webserver TAGS: []
- tasks:
- install apache packages TAGS: []
- copy apache conf TAGS: []
- ensure apache is running TAGS: []
- [root@ansible apache]# ansible-playbook apache.yaml --list-hosts #列出主机
-
- playbook: apache.yaml
-
- play #1 (webserver): webserver TAGS: []
- pattern: [u'webserver']
- hosts (4):
- host4
- host3
- host2
- host1
④ 执行剧本
- [root@ansible apache]# ansible-playbook apache.yaml
-
- PLAY [webserver] ************************************************************************************************
-
- TASK [Gathering Facts] ******************************************************************************************
- ok: [host2]
- ok: [host3]
- ok: [host1]
- ok: [host4]
-
- TASK [install apache packages] **********************************************************************************
- changed: [host2]
- changed: [host1]
- changed: [host4]
- changed: [host3]
-
- TASK [copy apache conf] *****************************************************************************************
- ok: [host2]
- ok: [host3]
- ok: [host1]
- ok: [host4]
-
- TASK [ensure apache is running] *********************************************************************************
- changed: [host2]
- changed: [host1]
- changed: [host4]
- changed: [host3]
-
- PLAY RECAP ******************************************************************************************************
- host1 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- host2 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- host3 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- host4 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook 是 Ansible 中用于描述自动化部署、配置和管理任务的核心组件。一个 Playbook 包含了一系列的任务,这些任务将被 Ansible 执行以实现特定的配置或操作。
playbook 中的每一个 play 的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts 用 于指定要执行指定任务的主机,须事先定义在主机清单中。
示例:
- hosts: websrvs:appsrvs
可用于 Host 和task 中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务,其可用于 play 全局或某任务;此外,甚至可以在sudo时使用 sudo_user 指定 sudo 时切换的用户。
示例:
- - hosts: websrvs
- remote_user: root
-
- tasks:
- - name: test connection
- ping:
- remote_user: wang
- sudo: yes #默认sudo为root
- sudo_user:wang #sudo为wang
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。
- action: module arguments
- #示例: action: shell wall hello
-
- module: arguments
- #示例: shell: wall hello
-
- 注意:shell和command模块后面跟命令,而非key=value
在 Playbook 中,Handlers 通常会在任务中触发,并在整个 Playbook 运行结束时才会执行。
示例:修改管理节点apace配置文件模板,拷贝到被管理节点,查看apache相关信息:
① 修改管理几点服务器apache监听端口号,执行剧本查看被代理节点服务器配置是否拷贝
- [root@ansible ~]# yum install -y httpd
- #Ansible服务器安装网站服务
- [root@ansible ~]# mkdir apache
- [root@ansible ~]# cd apache/
- [root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .
- [root@ansible apache]# sed -i 's/Listen 80/Listen 8080/' httpd.conf
② 查看被代理节点apache配置文件已及更新,但是并没有生效
③ 由于剧本服务模块指令是启动,需要定义、引用处理程序
注意:如果将 state=started 改为 restart ,将会导致每次执行剧本都会重启 apache 服务。
- [root@ansible apache]# vim apache.yaml
- - hosts: webserver #定义了将要执行任务的目标主机或主机组
- tasks:
- - name: install apache packages #对Playbook的描述,用于标识该Playbook的作用。
- yum: name=httpd state=present
- - name: copy apache conf
- copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
- notify: restart apache service #通知,当copy模块产生改变,通知程序重启,需要与handlers的name一样 #应用处理程序
- - name: ensure apache is running
- service: name=httpd state=started enabled=yes
- handlers: #当任务触发会执行 #定义处理程序
- - name: restart apache service #任务,重启apache(名字自定义)
- service: name=httpd state=restarted
④ 再次修改管理节点 apachep 配置文件端口号,执行剧本,查看被代理节点 apache 端口信息
Role 是一种可重用的组织结构,用于将相关的变量、任务和处理逻辑打包在一起。它是对任务和变量的封装,可以方便地在不同的 Playbooks 中重复使用。
Playbook 可以调用一个或多个 Role 来完成特定的配置任务。这种模块化的设计使得 Playbook 更加易读、易维护,并且能够促进代码的重用。通过将任务和变量封装到 Role 中,可以有效地减少重复编写相似任务的工作,并提高了整体的可维护性。
在 Playbook 中使用 Role 非常简单,只需要指定 Role 的名称即可:
- - hosts: servers
- roles:
- - common
- - webserver
- - database
在这个示例中,common, webserver和 database 都是 Role 的名称,Ansible 将会按照指定的顺序执行这些 Role 中定义的任务。
在 Ansible 中,Role 是一种组织和封装任务、变量和处理逻辑的方式。通过 Role,可以将相关的配置任务和变量打包在一起,以便在不同的 Playbooks 中重复使用。以下是关于 Role 的介绍:
- my_role/
- ├── tasks/ #包含了角色的主要任务。
- │ └── main.yml
- ├── handlers/ #包含了角色中定义的处理器。
- │ └── main.yml
- ├── templates/ #包含了角色中使用的模板文件
- ├── files/ #和静态文件。
- ├── vars/ #包含了角色中使用的变量。
- │ └── main.yml
- ├── defaults/ #包含了角色中使用的变量。
- │ └── main.yml
- └── meta/ #包含了角色的元数据,比如作者信息、依赖关系等。
- └── main.yml
在 Ansible Role 中,变量是一种重要的元素,用于定义和传递数据,以便在角色中的任务和模板中使用。以下是关于在 Ansible Role 中编写变量的介绍:
- my_role/
- ├── vars/
- │ └── main.yml
在 vars/main.yml 文件中,你可以定义角色中需要使用的各种变量。这些变量可以是全局的,也可以是与特定任务相关的局部变量。
- # vars/main.yml
- apache_port: 80
- apache_document_root: /var/www/html
在这个示例中,apache_port 和 apache_document_root 是两个角色中使用的变量,它们定义了 Apache 服务的端口号和文档根目录。
一旦定义了变量,你可以在角色的任务、模板或其他文件中引用这些变量。
- # tasks/main.yml
- - name: Ensure Apache is running
- service:
- name: apache2
- state: started
- vars:
- port: "{{ apache_port }}"
{{ apache_port }} 表示引用之前定义的 apache_port 变量,用于配置 Apache 服务的端口号。
值得注意的是,变量可以在多个级别进行定义和覆盖。在 Role 中,变量可以在 defaults/main.yml 中设置默认值,而在 Playbook 中也可以通过 vars 关键字来覆盖这些默认值。