内蒙古工程建设协会网站,企业网站建设版本,泉州网站模板建站,辽宁省大学生创新创业平台文章目录 在议playbook虚拟环境中安装ansibleplaybook 结合变量的一些演示普通的vars_files 变量#xff0c;在同级目录创建目录使用host_vars 定义变量group_vars定义变量根据不同系统操作不同版本传递多个外置变量举例几个不同的示例factswhenloophandlers 与 notifytags 任… 文章目录 在议playbook虚拟环境中安装ansibleplaybook 结合变量的一些演示普通的vars_files 变量在同级目录创建目录使用host_vars 定义变量group_vars定义变量根据不同系统操作不同版本传递多个外置变量举例几个不同的示例factswhenloophandlers 与 notifytags 任务标签异常处理nginx 的异常处理 jinja2roles 在议playbook
主要是使用不同的模块进行编排
如果格式有问题找chatgpt调整下格式输出就可以
缺点是比较死板不能成体系 虚拟环境中安装ansible
要在CentOS 7系统上让Ansible使用Python 3你可以按照以下步骤进行操作确认你的CentOS 7系统已安装Python 3。你可以通过在终端中运行python3 --version命令来检查是否已安装Python 3。安装Python 3的pip包管理工具。在CentOS 7上你可以使用以下命令安装sudo yum install python3-pip
安装python3-devel软件包以支持Python 3的开发库。运行以下命令进行安装
sudo yum install python3-devel
创建一个Python 3虚拟环境可选。虚拟环境可以帮助你隔离Ansible所需的Python包与系统级安装的Python包。使用以下命令创建虚拟环境
python3 -m venv ansible-env
激活虚拟环境source ansible-env/bin/activate
安装Ansible和所需的Python包。在虚拟环境中运行以下命令
pip install ansible
配置Ansible以使用Python 3。打开/etc/ansible/ansible.cfg文件并找到以下行
# interpreter_python auto_silent
取消注释并将其更改为以下内容interpreter_python /usr/bin/python3
确认Ansible使用Python 3。运行以下命令来检查
ansible --versionplaybook 结合变量的一些演示
普通的vars_files 变量在同级目录创建目录
- hosts: webserversvars_files:- ./test.ymltasks:- name: Output Varsdebug:msg:- {{ http_packages }}- {{ db_packages }}$cat test.yml
test: ansible_vars_files
http_packages: 123
db_packages: 123r返回结果{msg: [123,null]
}
注意 test.yml 一定要有这个变量哪怕为空否则报错test.yml 可以被多个playbook 引用vars_files:- ./test.yml
使用host_vars 定义变量
hosts 配置文件为
[webservers]
1.1.1.1 aaa2 bbbmaster[webservers:vars]
port80---
- hosts: webserverstasks:- name: output variablesdebug:msg: {{ aaa }} {{ bbb }} {{ port }} {msg: 2 master 80
}
group_vars定义变量
在项目目录中创建 group_vars 目录然后在创建一个文件文件的文件名称要与
inventory 清单中的组名称保持完全一致在 group_vars 目录中创建 webservers 文件为 webservers 主机组设定变
量msg: [11,22]
}$cat group_vars/all
web: 11
web1: 22
(ansible-env)$cat t5.yml
- hosts: webserverstasks:- name: Output Vaiablesdebug:msg:- {{ web }}- {{ web1 }}
根据不同系统操作不同版本 注意 www 用户是有sudo 权限 ---
- hosts: webserversbecome: yesbecome_user: wwwtasks:# 通过fact变量判断系统为centos才会安装httpd- name: Centos Install httpdyum: namehttpd statepresentwhen: (ansible_distribution CentOS)# 通过fact变量判断系统为ubuntu才会安装httpd2- name: Ubuntu Install httpdyum: namehttpd2 statepresentwhen: (ansible_distribution Ubuntu)
传递多个外置变量
ansible-playbook f5.yml -i hosts -e
web_packagesGeoIP -e ftp_packagestelnet举例几个不同的示例
- hosts: alltasks:- name:shell: netstat -lntpregister: System_Status- name: Get System Statusdebug: msg{{System_Status.stdout_lines}}
- hosts: webserverstasks:- name: Output variables ansible factsdebug:msg: this default IPv4 address {{ ansible_fqdn}} is {{ ansible_default_ipv4.address }}- hosts: alltasks:- name: Ignore Falsecommand: /bin/falseignore_errors: yes- name: touch new filefile: path/tmp/old statetouch
facts
用来采集客户端信息
ansible localhost -m setup -a filteransible_default_ipv4when
when 判断在 Ansible 中的使用频率非常高比如 yum 模块可以自动检测软件包是
否已被安装而无需人为干涉但对于有些任务则是需要进行判断才可以实现的。
比如 web 节点都需要配置 nginx 仓库但其他节点并不需要此时就会用到
when 判断。
比如: Centos 与 Ubuntu 都需要安装 Apache 而 Centos 系统软件包为
httpd 而 Ubuntu 系统软件包为 httpd2 那么此时就需要判断主机系统然
后为不同的主机系统安装不同的软件包。hen: (ansible_hostname is match(web*))
主机名不为web的不做任何处理
loop
loop 是重复
- hosts: web
tasks:
- name: Add Users
user:
name: {{ item.name }}
groups: {{ item.groups }}
state: present
loop:
- { name: testuser1, groups: bin }
- { name: testuser2, groups: root }- hosts: all
tasks:
- name: Configure Rsync Server
copy: src{{ item.src }} dest/etc/{{ item.dest }} mode{{
item.mode }}
with_items:
- {src: rsyncd.conf, dest: rsyncd.conf, mode: 0644}
- {src: rsync.passwd, dest: rsync.passwd, mode:
0600}handlers 与 notify
Handlers 是一个触发器同时是一个特殊的 tasks 它无法直接运行它需要被
tasks 通知后才会运行。比如 httpd 服务配置文件发生变更我们则可通过
Notify 通知给指定的 handlers 触发器然后执行相应重启服务的操作如果配
置文件不发生变更操作则不会触发 Handlers 任务的执行如果配置文件发生变化会调用该handlers下面的对应名称的task
handlers:- name: Restart Httpd Serverservice: namehttpd staterestartedhandlers 注意事项
1.无论多少个 task 通知了相同的 handlers handlers 仅会在所有
tasks 结束后运行一次。
2.只有 task 发生改变了才会通知 handlers 没有改变则不会触发
handlers
3.不能使用 handlers 替代 tasks 、因为 handlers 是一个特殊的 taskstags 任务标签
默认情况下 Ansible 在执行一个 playbook 时会执行 playbook 中所有的任
务。而标签功能是用来指定要运行 playbook 中的某个特定的任务
1.为 playbook 添加标签的方式有如下几种
对一个 task 打一个标签
对一个 task 打多个标签
对多个 task 打一个标签
2. task 打完标签使用的几种方式
-t 执行指定tag标签对应的任务
--skip-tags 执行除 --skip-tags 标签之外的所有任务ansible-playbook --skip-tags install_server
xxx.yml标签结合include
[rootansible ~]# cat main.yml
- hosts: localhost
tasks:
- name: Installed Tomcat8 Version
include: install_tomcat8.yml
tags: tomcat8
- name: Installed Tomcat9 Version
include: install_tomcat9.yml
tags: tomcat9异常处理
- hosts: webserverstasks:- name: configure httpd servertemplate:src: ./httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: Restart Httpd Server- name: Check HTTPDshell: /usr/sbin/httpd -tregister: httpd_checkfailed_when: httpd_check.rc ! 0 or OK not in httpd_check.stdout- name: start httpd serverservice:name: httpdstate: startedenabled: yeshandlers:- name: Restart Httpd Serversystemd:name: httpdstate: restarted
nginx 的异常处理
- hosts: webservertasks:- name: Install Nginx Serveryum:name: nginxstate: present- name: Configure Nginx Servertemplate:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confnotify: Restart Nginx Server- name: Check Nginx Servershell: /usr/sbin/nginx -tregister: check_nginxchanged_when: successful in check_nginx.stdout- name: Start Nginx Serverservice:name: nginxstate: startedenabled: yeshandlers:- name: Restart Nginx Serversystemd:name: nginxstate: restarted在这个标准格式的 Playbook 中我们在hosts中指定了目标主机组并定义了多个任务。每个任务都有一个名称以及对应的模块和参数。要解决场景1即要求每台主机的端口都不一样可以在 Jinja2 模板文件 (nginx.conf.j2) 中使用变量来动态设置端口号。例如可以通过定义一个名为nginx_port的变量并在模板文件中使用它来设置 Nginx 的监听端口。要解决场景2即使用 Jinja2 模板来修改被管理主机的配置文件我们使用了template模块。该模块会将指定的模板文件复制到远程主机并在复制过程中解析文件中的变量值。在Check Nginx Server任务中我们使用了changed_when来定义任务的改变条件。只有当检查 Nginx 配置的输出中包含successful时任务才会被标记为已改变。最后在处理程序部分我们定义了一个名为Restart Nginx Server的处理程序它会在被通知时使用systemd模块重启 Nginx 服务。请注意Ansible Playbook 的格式要求严格正确的缩进和符号使用非常重要。以上提供的输出已经按照标准格式进行了调整。jinja2
Jinja2 是 Python 的全功能模板引擎
Ansible 需要使用 Jinja2 模板来修改被管理主机的配置文件。
ansible 使用 jinja2 模板需要借助 template 模块实现那 template 模块是用
来做什么的?
template 模块和 copy 模块完全一样都是拷贝文件至远程主机区别在于
template 模块会解析要拷贝的文件中变量的值而 copy 则是原封不动的将文件拷
贝至被控端。roles
更加规范更加标准的去灵活安排你维护的业务