ansible
1.ansible简介
Ansible通过一个基于Python的agentless架构来实现自动化和配置管理。它使用SSH协议连接到远程服务器或设备,然后在远端服务器上执行模块,最后将执行结果汇报回来告知控制节点执行结果。这种通信模式保证了所有Ansible任务都是在目标主机上运行的,而不是在控制节点上运行,因此可以最大程度地降低传输成本和安全风险。
2.ansible安装
2.1设置EPEL仓库
yum install epel-release -y
2.2使用yum安装Ansible
yum install ansible -y
#安装后生成的主要文件
/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts #主机库(host inventory)管理被监控的主机
/usr/bin/ansible #主程序
/usr/bin/ansible-doc #文档
/usr/bin/ansible-playbook #剧本
2.3查看ansible的版本
ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg #通过这个可以确定当前读取的cfg文件
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
ansible获取ansible.cfg文件的顺序
1.当前目录下的ansible.cfg文件
2.用户家目录(~/.)下ansible.cfg文件
3./etc/ansible/ansible.cfg全局配置文件
4.以上都没有则用ansible默认配置
2.4配置ansible.cfg文件
Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
[defaults] #inventory = /etc/ansible/hosts #主机列表配置文件 #library = /usr/share/my_modules/ #库文件存放目录 #remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录 #local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录 #forks = 5 #默认并发数 #sudo_user = root #默认sudo 用户 #ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码 #ask_pass = True #remote_port = 22 #默认使用端口 #host_key_checking = False #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机 #log_path=/var/log/ansible.log #日志文件,建议启用 #module_name = command #默认模块,可以修改为shell模块 [privilege_escalation] #普通用户提权配置 #become=True #become_method=sudo #become_user=root #become_ask_pass=False
#/etc/ansible/ansible.cfg文件常用格式,可借鉴
[defaults]
inventory = /home/student/ansible/inventory #主机文件,默认为/etc/ansible/hosts
roles_path = /home/student/ansible/roles #role路径,默认路径为/usr/share/ansible/roles
remote_user = root #连接远程主机时默认使用root用户名
[privilege_escalation] #建议配置提权
become=True #连接后是否自动在受管主机上切换用户(通常切换为root)。
become_method=sudo #如何切换用户(通常为sudo,这也是默认设置,但也可选su)
become_user=root #要在受管主机上切换到的用户(通常时root,这也是默认值)。
become_ask_pass=False #是否需要为become_method提示输入密码。默认为false。
3.前期准备
3.1设置ssh免密登录
详看《SSH配置免密登录方法》
3.2构建主机清单
vi /etc/ansible/hosts
[dev] #组名
10.80.39.77
10.80.39.78
[test]
10.80.39.79
[webservers:children] #dev和teset组是webservers主机组的成员
dev
test
如果没有配置ssh免密登录,需要在hosts文件中写入密码,格式如下
[dev] ansible_ssh_host=10.80.39.77 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass="123456"
ansible_ssh_host=10.80.39.78 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass="123456"
4.常用临时命令
4.1 ping模块检查节点联通性
ansible dev -m ping #默认在/etc/ansible/hosts文件寻找组,也可以用-i指定hosts文件
4.2 command模块(干脆直接用shell)
ansible的默认模块,不指定-m参数的时候,使用的就是command模块; 常见的命令都可以使用,但命令的执行不是通过shell来执行的,所以< > | and & z这些操作都不可以,不支持管道,没法批量执行命令
4.3 shell模块
使用shell模块的时候默认是通过/bin/sh来执行的,所以在终端输入的各种命令都可以使用.
ansible -i /etc/ansible/hosts dev -m shell -a "source ~/.bash_profile && df -h|head -n 1"
4.4 scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行。
cat /etc/ansible/test.sh #!/bin/bash date hostname echo "大家好,我是互联网小李,脚本执行成功"
ansible -i /etc/ansible/hosts web-servers -m script -a "/etc/ansible/test.sh"
4.5 copy模块
copy模块:实现主控端向目标主机拷贝文件,类似scp功能
#src源地址,dest目的地址
ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/etc/hosts dest=/root owner=root group=root mode=0777"
4.6 file模块给文件设置权限
ansible -i /etc/ansible/hosts dev -m file -a "path=/root/hosts mode=0755"
4.7 stat模块获取远程文件信息
ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/root/hosts"
4.8 get_url模块实现远程主机下载指定的url地址
ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
#force=yes
的作用是强制下载此RPM文件并覆盖目标文件
4.9 yum模块
ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd state=latest"
4.10 cron模块远程管理主机crontab配置
#设置任务
ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='echo 我是互联网小李'" #name为任务名称,可通过此确定任务进行修改
#查看任务
ansible web-servers -m cron -a "user=root state=list" #user=root,root用户下的任务
#删除任务
ansible web-servers -m cron -a "user=root name='backup' state=absent" #删除‘backup’任务
4.11 service 远程管理主机系统服务模块
ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=started enabled=yes"
#state参数: started、stopped、restarted、reloaded,不能查看状态
4.12 user模块管理远程主机的用户
ansible -i /etc/ansible/hosts web-servers -m user -a "name=itlaoxin state=present"
#state参数:present增加用户,absent删除用户,locked锁定用户,unlocked解锁用户
5.role角色
5.1安装rhel-system-roles
yum install -y rhel-system-roles
ansible-galaxy list #查看可以使用的角色,角色默认下载在/usr/share/ansible/roles
ansible-galaxy install geerlingguy.mysql -p roles/ #从官网下载角色到指定目录
5.2将roles模板复制到roles_path下
#路径和ansible.cfg中的roles_path相对应 cp -r /usr/share/ansible/roles/rhel-system-roles.timesync /home/student/ansible/roles/timesync
5.3创建yaml执行文件
cat timesync/README.md #根据使用需求,到README.md中寻找示例
vi timesync.yml --- - hosts: all vars: timesync_ntp_servers: - hostname: pool.ntp.org iburst: yes roles: - rhel-system-roles.timesync
5.4yaml文件语法检查
ansible-playbook --syntax-check timesync.yml #语法检查
ansible-playbook timesync.yml --check #模拟运行yaml
5.5运行yaml
ansible-playbook timesync.yml
5.6验证结果
ansible all -m shell -a 'chronyc sources -v '
6.playbook剧本
6.1playbook介绍
6.1.1 配置文件格式
playbook 由 YMAL 语言编写,以下为 playbook 常用到的YMAL格式 1、文件的第一行应该以 "---" (三个连字符)开始,表明 YMAL 文件的开始。 2、在同一行中,# 之后的内容表示注释,类似于 shell,python 和 ruby。 3、YMAL 中的列表元素以 ”-” 开头然后紧跟着一个空格,后面为元素内容。 4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。 5、play 中 hosts,variables,roles,tasks 等对象的表示方法都是键值中间以 ":" 分隔表示,":" 后面还要增加一个空格。
6.1.2 配置文件的基础组件
Hosts:运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户;
sudo_user:
tasks:任务列表
6.1.3 playbook核心元素
Hosts:主机组;
Tasks:任务列表;
Variables:变量,设置方式有四种;
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
6.2 variables变量
variables变量有四种定义方法。如下
6.2.1 facts :可直接调用
ansible中有setup模块,这个模块就是通过facts组件来实现的。这里的variables也可以直接调用facts组件的facters我们可以使用setup模块来获取,然后直接放入我们的剧本之中调用即可
6.2.2 用户自定义变量
方法1:
通过命令行传入:ansible-playbook 命令的命令行中的 -e VARS, --extra-vars=VARS,这样就可以直接把自定义的变量传入。
ansible-playbook nginx.yml -e rpmname=keepalived #rpmname为yaml中的变量名
方法2: 在 playbook 中定义变量:我们也可以直接在yaml中定义我们的变量。示例如下: 、
vars:
- var1: value1
- var2: value2
6.2.3通过roles传递变量
playbook执行角色调用时,读取变量优先级roles/vars/main.yml>playbook > hosts
后面有角色专门的描述
6.2.4 在Inventory主机清单中定义
#向不同的主机传递不同的变量 IP/HOSTNAME varaiable=value var2=value2 #向组中的主机传递相同的变量 [groupname:vars] variable=value
6.3 templates模板
Ansible 模板(templates)是一种使用户能够快速轻松生成配置文件的方法。模板允许用户使用编程语言(如 Jinja2 和 Mako)将变量插入到文件中。
这些模板文件包含了一些占位符用来替换为在 Ansible Playbook 中定义的变量或者主机级别的变量,从而根据具体环境动态生成文件。
使用roles角色时,template文件必须存放于templates目录下,且命名为 .j2 结尾
范例:利用template 同步nginx配置文件
- 定义模板
[root@ansible ansible]# mv /tmp/nginx.conf /tmp/nginx.conf.j2 [root@ansible ansible]# vi /tmp/nginx.conf.j2 ddworker_processes {{ ansible_processor_vcpus }}; listen {{ nginxport }}; #定义变量替换 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server { listen 8888; }
- 修改剧本,如下两个地方
6.4 条件测试
- when语句:在task中使用,jinja2的语法格式
tasks: - name: install conf file to centos7 template: src=files/nginx.conf.c7.j2 when: ansible_distribution_major_version == "7" - name: install conf file to centos6 template: src=files/nginx.conf.c6.j2 when: ansible_distribution_major_version == "6"
- 循环:迭代,需要重复执行的任务,对于迭代项的引用,固定变量名为“item”,而后在task中使用with_items给定的迭代的元素列表
tasks: - name: unstall web packages yum: name={{ item }} state=absent with_items: - httpd - php - php-mysql
6.5 字典
- ansible playbook也支持字典功能,举例如下:
- name: install some packages yum: name={{ item }} state=present with_items: - nginx - memcached - php-fpm - name: add some groups group: name={{ item }} state=present with_items: - group11 - group12 - group13 - name: add some users user: name={{ item.name }} group={{ item.group }} state=present with_items: - { name: 'user11', group: 'group11' } - { name: 'user12', group: 'group12' } - { name: 'user13', group: 'group13' }
7.角色定制
7.1 简介
- 对于以上所有方式有个缺点就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件,很难实现灵活的调用roles用于层次性,结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。
- 要使用roles只需要在playbook中使用include指令即可。
- 简单来讲,roles就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的include它们地一种机制。
- playbook执行角色调用时,读取变量优先级roles/vars/main.yml>playbook > hosts
7.2 角色集合
files/:存储由copy或script等模块调用的文件; tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用; handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用; vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用; templates/:存储由template模块调用的模板文本; meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用; defaults/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
7.3 添加新角色
ansible-galaxy init ***** #使用init命令初始化新角色的基本结构,节省创建各种目录和main.yml文件的时间
7.4 示例-部署apache服务的自动安装
7.4.1 添加apache角色
cd /home/devops/ansible mkdir roles #创建角色目录 cd roles #进入角色目录 ansible-galaxy init apache #使用init命令添加新角色apache cd /home/devops/ansible #进入ansible目录 ansible-galaxy list #列出已安装角色
7.4.2 创建任务tasks
cd /home/devops/ansible/roles/apache #进入apache目录 rm -fr tests #删除测试目录 cd tasks #进入任务目录 vim main.yml #编写配置文件
--- - name: install apache #安装apache服务 yum: name: httpd state: present - name: config apache #配置apache服务 template: src: httpd.conf.j2 dest: /etc/httpd/conf/httpd.conf notify: restart httpd #与下面触发器相对应 - name: start apache #开启apache服务 service: name: httpd state: started
- name: stop firewalld #关闭防火墙
service:
name: firewalld
state: stopped
- name: copy index.html #拷贝默认发布文件
copy:
src: index.html
dest: /var/www/html/index.html
7.4.3 创建触发器handlers
cd handlers #进入任务目录
vim main.yml #编写配置文件
---
- name: restart httpd #此处的name与task/main.yml中的notify一致,重启apach服务
service:
name: httpd
state: restarted
7.4.4 创建发布文件
vim index.html #编辑默认发布文件
haohao
7.4.5 创建httpd.conf
在本机上提前安装好httpd服务,将生成的配置文件httpd.conf拷贝到templates目录下。
sudo cp /etc/httpd/conf/httpd.conf /home/devops/ansible/roles/apache/templates #拷贝配置文件 sudo chown devops.devops httpd.conf #修改所有人和所有组 mv httpd.conf httpd.conf.j2 #修改文件类型
7.4.6 定义变量
vim vars/main.yml http_host: "{{ ansible_hostname }}" #ansible_hostname是Ansible中的一种变量替换方式,用于获取目标主机的主机名信息
http_port: 80
7.4.7 编辑apache.yml文件
cd /home/devops/ansible #进入ansible目录 vim apache.yml --- - hosts: db #在指定主机调用执行角色 roles: - apache
7.4.8 检查并执行apache.yml文件
ansible-playbook apache.yml --check #模拟运行,也是检查语法
ansible-playbook apache.yml
7.4.9 测试结果
curl 172.25.66.3
8. 巧用ansible-doc
#命令格式: ansible-doc -l #列出所有的模块列表
ansible-doc -l |grep -i lvm #-i 忽略大小写 ansible-doc -s 模块名 #查看指定模块的参数 ansible-doc 模块名 #查看指定模块的详细参数及示例EXAMPLE #示例 ansible-doc copy #查看copy模块的帮助 ansible-doc yum #查看yum模块的帮助 #查看yum帮助信息 EXAMPLES: - name: install the latest version of Apache yum: name: httpd state: latest - name: ensure a list of packages installed yum: name: "{{ packages }}" vars: packages: - httpd - httpd-tools - name: remove the Apache package yum: name: httpd state: absent
提示
#在传送命令下载的时候如果此前有操作过,那些会显示执行成功,但是会显示绿色 #传送显示颜色信息说明 1.黄色:对远程节点进行相应修改 2.绿色:对远程节点不进行相应修改 3.红色:操作执行有问题 4.紫色:表示对命令执行发出警告信息(可能存在问题)
9.block rescue always三件套
block任务块是主要的tasks,如果运行正确,不会运行rescue;
block里的tasks运行失败了,才会运行rescue里的tasks;
block和rescue里的tasks无论是否运行成功,都会运行always里的tasks。
范例
--- - name: block_rescue_always演示 hosts: all tasks: tasks1 - name: 更新数据库 block: - name: 执行更新数据库 shell: cmd: /usr/local/lib/upgrade_database # 如果执行更新数据库失败,就会执行回滚数据库进行补救 rescue: - name: 回滚数据库 shell: cmd: /usr/local/lib/revert_database # 不管block和rescue的执行结果,都会重启数据库服务 always: - name: 总是重启数据库服务 service: name: mariadb state: restarted
10.变量
ansible变量(vars)、机密(vaults)与事实(facts)
变量优先级(高--低)
- 命令行定义变量--> yaml文件中的变量(vars_file ---> vars)--->主机清单中单独定义主机变量--->主机清单公共变量
10.1 事实变量
facts组件是ansible用于采集被管理机器设备信息的一个功能, 采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac地址,时间/日期相关数据,硬件信息等。
ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用,而setup模块获取这些信息的方法就是依赖于fact。
10.1.1通过setup查看变量
我们可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来过滤指定的信息。setup模块获取的整个facts信息被包装在一个json格式的数据结构中,ansible_facts是最外层的值。
10.1.2 Ansible事实变量示例:
方式3为2.5之前版本,但新版兼容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类