Ansible整理笔记
Ansible 自动化运维笔记
ansible-简介
Logo

介绍ansible
Ansible 是一种常用的自动运维化工具,基于 python 开发,分布式,无需客户端,轻量级,配置语言采用 YAML。
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,
实现了批量系统配置、批量程序部署、批量运行命令等功能,无客户端。
ansible特性
- 模块化:调用特定的模块,完成特殊的任务。
- Paramiko (python 对 ssh 的实现),PyYaml,jinja2 (模块语言) 三个关键模块。
- 支持自定义模块,可使用任何编程语言写模块。
- 基于 python 语言实现。
- 部署简单,基于 python 和 SSH (默认已安装),agentless,无需代理不依赖 KPI (无需 SSL)。
- 安全,基于 OpenSSH
- 幂等性:一个任务执行一次和执行 n 遍效果一样,不因重复执行带来意外情况。
- 支持 playbook 编排任务,YAML 格式,编排任务,支持丰富的数据结构。
- 较强大的多层解决方案 role。
ansible作用目标
- 自动化部署 APP
- 自动化管理配置项
- 自动化的持续交付
- 自动化的云服务管理
ansible架构
工作原理
部署ansible
yum install -y epel-release
安装epel源,建议使用下方阿里YUM
systemctl stop NetworkManager
systemctl disable NetworkManager
sestatus 查看SELLinux 是否自启,enabled ,需修改
vi /etc/selinux/config
SELINUX=disabled
setenforce 0
(临时关闭selinux防火墙 getenforce可查看selinux的状态)
阿里yum源配置
- 进入yum配置文件的目录下
cd /etc/yum.repos.d/
- 备份当前yum源(注:如果改目录下有其他关联的.repo文件也需要一起重命名备份,mv成xxx.bak文件)
mv CentOS-Base.repo CentOS-Base-repo.bak
-
使用之前请确保服务器上已经安装wget,如未安装执行下条命令进行安装
yum -y install wget
-
使用wget下载阿里yum源repo文件
wget http://mirrors.aliyun.com/repo/Centos-7.repo
-
清理默认缓存包
yum clean all
-
把下载下来的阿里云repo文件设置成默认源
mv Centos-7.repo CentOS-Base.repo
-
生成阿里云yum源缓存并更新yum源
yum makecache
yum update
-
安装ansible
yum -y install ansible
-
检查部署是否完成
rpm -ql ansible
列出所有文件rpm -qc ansible
查看配置文件ansible --help
查看ansible帮助ansible-doc -l
看所有模块(A10,华为,docker,EC2,aws等等广大厂商设备)ansible-doc -s yum
看yum模块,了解其功能
免密方式登陆(可选)
ssh-keygen
ssh-copy-id 目标ip地址
推送公钥
ansible基础
域名解析(可选,如果不做直接添加客户机IP即可)
vi /etc/hosts
添加文件最下面
192.168.23.10 ansible 192.168.23.11 host1 192.168.23.12 host2 192.168.23.13 host3
定义主机清单
vi /etc/ansible/hosts
添加到文件最下面
host1、host2、host3
因为做了域名解析所以可添加名称,如果未做域名解析请添加客户机IP地址
测试连通性
ansible服务器上执行下面命令
ansible host1 -m ping
简洁输出
ansible host1 -m ping -o
- 拆解命令:测试host1连通性,-m指定模块,什么功能,ping只是其中一个模块
- know_hosts 增加用户名选项,增加密码选项
ansible host2 -m ping -u root -k
- know_hosts 增加用户名选项,增加密码选项
Inventory—主机清单
简介:清查;存货清单;财产目录;主机清单
增加主机组
-
vim /etc/ansible/hosts
-
在最下面添加一下内容 用中括号[]扩起来,中括号里添加信息为 组名(可自定义)
-
[webserver]
host1
host2
host3
-
测试是否生效
ansible webserver -m ping -o
输出提示
[root@localhost ~]# ansible webserver -m ping -u root -k -o SSH password: host3 | SUCCESS => {"changed": false, "ping": "pong"} host1 | SUCCESS => {"changed": false, "ping": "pong"} host2 | SUCCESS => {"changed": false, "ping": "pong"}
增加用户名 密码
-
vim /etc/ansible/hosts
-
[webserver]
host[1:4] ansible_ssh_user='root' ansible_pass='123456'
-
测试是否配置成功
ansible webserver -m ping -o
免用户名和密码成功
主机和主机的用户名密码不同配置
[webservers] host1 ansible_ssh_user='root' ansible_ssh_pass='777777' host[2:4] ansible_ssh_user='root' ansible_ssh_pass='666666
增加端口
如果遇到服务器sshd程序不是22的情况下需进行以下配置
vim /etc/ansible/hosts
[webserver] host1 ansible_ssh_user='root' ansible_ssh_pass='777777' ansible_ssh_port='指定端口号' host[2:4] ansible_ssh_user='root'
组:变量
ansible内部变量可以帮助我们简化主机清单的设置
vim /etc/ansible/hosts
[webserver] host[1:4] [webserver:vars] vars指定是‘变量的意思 ansible_ssh_user='root' ansible_ssh_pass='666666'
常用变量

子分组
将不同的分组进行组合
vim /etc/ansible/hosts
[apache] host[1:2] [nginx] host[3:4] [webserver:children] children内置变量,可以理解定义一个组叫webserver apache nginx [webserver:vars] ansible_ssh_user='root' ansible_ssh_pass='666666'
自定义主机列表
vim hosylist
创建文件插入一下内容[dockers] host1 host2 [dockers:vars] ansible_ssh_user='root' ansible_ssh_pass='666666'
测试是否配置成功
**ansible -i hostlist dockers -m ping -o **
**ansible -i 绝对路径 dockers -m ping -o **
**-i 指的是链接外部主机清单,后边应该加上绝对路径(如果本身就在文件目录下直接指定’文件名‘即可) **
**hostlist 文件名 **
dockers 主机组 组名
ansible -i hostlist dockers -m ping -o
Ad-Hoc-点对点模式
- 简介
临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。
复制模块
帮助 ansible-doc copy
这里我想把 ansible 服务器下的 nginx 源码包下发到所有添加过主机清单下的主机
复制文件到客户机某个目录下
ansible webserver -m copy -a 'src=/root/nginx-1.8.1.tar.gz dest=/tmp'
- 拆解
- webservser:主机清单下的组 -m :应用什么模块 copy :应用复制模块 -a :接模块对应的参数 src : source 资源 /root/nginx-1.8.1.tar.gz nginx:源码包路径 dest :destination 目的地 /tmp:对方主机/tmp目录下
修改文件主人、账号、权限
ansible webserver -m copy -a 'src=/root/nginx-1.8.1.tar.gz dest=/tmp/ owner=root group=bin mode=777'
- 拆解
- owner = 主人 group = 账号 mode = 权限
这里是把ansible服务器下/root目录下的/nginx-1.8.1.tar.gz源码包复制到主机清单下的所有主机的tmp目录下 主人是root group账号是bin mode权限777 如果默认不写owner和group那么主人和账号全部是root
备份
如果文件有多份,可以进行备份。
ansible webserver -m copy -a 'src=/root/hostlist/ dest=/tmp owner=root group=bin mode=777 backup=yes
- 拆解
- backup 备份
把ansible服务器下的root目录下的hostlist文件分别复制到所有主机清单下的/tmp目录,主人是root 账号是bin 权限是777 进行备份 备份这里可以理解为如果客户机下已经有hostlist这个文件了,那么如果不改变文件,那么执行命令ansible虽然显示成功其实是没有变化的 那么如果修改了文件执行命令的时候不加入backup(备份)参数的话,复制到客户机下默认是会把之前的原文件覆盖掉的,那么如果加了backup进行复制的话 会在原文件修改成另一个名字 source.5653.2022-09-30@16:20:14~ 类似这种
用户模块
帮助 ansible-doc user
创建用户
ansible wbserver -m user -a 'name=aofa state=present'
创建用户,用户名叫aofa
修改密码
-
生成加密密码
echo '2911779835' | openssl passwd -1 -stdin
生成加密密码值$1$AfW8MPE.$mnV0Qo2UMYAKJEDoHkDlh.
值
-
修改密码
ansible webserver -m user -a 'name=aofa password="$1$AfW8MPE.$mnV0Qo2UMYAKJEDoHkDlh."'
修改shell
ansible webserver -m user -a 'name=aofa shell=/sbin/nologin append=yes'
append 追加
删除用户
ansible webserver -m user -a 'name=aofa state=absent'
absent删除
软件包管理模块
帮助 ansible-doc yum
ansible webserver -m yum -a 'name="*" state=latest'
升级服务器所有包
ansible webserver -m yum -a 'name="httpd" state=latest'
安装apache
ansible webserver -m yum -a 'name="httpd" state=absent'
卸载apache
服务模块
帮助 ansible-doc service
ansible webserver -m service -a 'name=httpd state=started'
启动httpd服务
ansible webserver -m service -a 'name=httpd state=started enabled=yes'
开机自启httpd服务
ansible webserver -m service -a 'name=httpd state=stopped'
停止httpd服务
ansible webserver -m service -a 'name=httpd state=restarted'
重启httpd服务
ansible webserver -m service -a 'name=httpd state=started enabled=no'
开机不自启httpd服务
文件模块
帮助 ansible-doc file
ansible host1 -m file -a 'path=/tmp/88.txt mode=777 state=touch'
在host1主机的tmp目录下创建文件为88.txt,权限为777
ansible webserver -m file -a 'path=/tmp/99 mode=775 state=directory'
把webserver组的所有主机/tmp目录下创建一个名字为99的目录,权限为775
收集模块
帮助 ansible-doc setup
ansible host1 -m setup
收集host1系统的全部信息
ansible host1 -m setup -a 'filter=ansible_processor'
收集出host1系统的信息 过滤出CPU的信息 filter过滤 ansible_processorCPU信息
Shell模块
帮助ansible-doc shell
ansible webserver -m shell -a 'yum install -y vim'
把webserver下的所有主机都安装上vim
ansible webserver -m shell -a 'df -h'
查看webserver下所有主机的磁盘挂载信息
ansible webserver -m shell -a 'useradd hanqingdian'
把webserver下的所有主机都创建一个名字为hanqingdian的用户
YAML-YAML
-
语法:
-
列表
-
fruits:
-
- Apple
-
- Orange
-
- Strawberry
-
- Mango
-
-
-
字典
- martin:
- name: Martin D'vloper
- job: Developer
- skill: Elite
- martin:
-
需求:通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程。
准备工作
ansible webserver -m shell -a 'yum -y remove httpd thhpd-tools'
卸载要部署主机上的的软件服务避免冲突
yum -y install httpd
在ansible服务器上安装httpd服务方便我们后续修改配置文件进行下发给其他主机
mkdir apache
创建一个目录名字为apache
cd apache
cp -rf /etc/httpd/conf/httpd.conf .
把httpd.conf文件复制到apache目录下
vim httpd.conf
找到Listen 把80改成8080
编写剧本
touch apache.yaml
创建剧本文件名字为 apache.yaml
- hosts: host2 tasks: - name: install apache packages yum: name=httpd state=present - name: copy apache conf copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf - name: ensure apache is running service: name=httpd state=started enabled=yes
这里的hosts代表要应用哪台主机
tasks:任务
name:解释
yum、copy、service分别是软件包管理模块,复制模块以及服务模块
注意这里有很多空格,建议粘贴到记事本上进行手敲
剧本验证
ansible-playbook apache.yaml --syntax-check
检验语法
ansible-playbook apache.yaml --list-tasks
列出任务
ansible-playbook apache.yaml --list-hosts
列出主机
ansible-playbook apache.yaml
执行
handlers
- 场景使用
- 一般用到handlers都体现在配置文件发生了变化需要重新分发到不同的主机上
例如:当然apache的端口为8080,将其修改为80
vim httpd.conf
修改:Listen为80,那么这种情况下在使用之前的剧本只是起到了覆盖效果配置还是没有生效,所以要增加处理程序,设置触发器。
因为apache修改端口完成之后需要重新启动httpd程序,当然生产环境下是不可能没事就重启的,这样会给我们造成用户丢失的现象,那么这个时候我们就会用到handlers
vim apache 编写之前的剧本 - hosts: webserver tasks: - name: install apache packges yum: name=httpd state=present - name: copy apacher conf copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd service 2、引用处理程序 这里冒号后面的必须要和handlers下面的name一摸一样否则会失败 - name: ensure apache is running service: name=httpd state=started enabled=yes handlers: 1、定义处理程序 - name: restart httpd service service: name=httpd state=restarted :wq退出 命令行执行:ansible-playbook apache.yaml 再次执行,配置生效,触发成功
Role-角色扮演
- 简介
- roles则是在ansible中,playbooks的目录组织结构。将代码或文件进行模块化,成为roles的文件目录组织结构,易读,代码可重用,层次清晰。
需求:通过role远程部署nginx并配置
准备工作
目录结构
yum -y install tree

准备目录结构
mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml echo 1234 > roles/nginx/files/index.html yum install -y nginx && cp /etc/nginx/nginx.conf /root/roles/nginx/templates/nginx.conf.j2
编写任务
tasks任务
vim /root/roles/nginx/tasks/main.yaml --- 这个三个减号必须添加 - name: install epel-release packge yum: name=epel-release state=latest - name: install nginx packge yum: name=nginx state=latest - name: copy index.html copy: src=index.html dest=/usr/share/nginx/html/index.html - name: copy nginx.conf template template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx - name: make sure nginx sservice running service: name=nginx state=started enabled=yes
准备配置文件
templates金甲模版文件,可支持自定义变量以及ansible已有变量
vim /root/roles/nginx/templates/nginx.conf.j2 # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes {{ ansible_processor_cores }}; {{ ansible_processor_cores }} ansible已知变量 执行剧本之后会自动识别cpu个数添加到这里 error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections {{ worker_connections }}; {{ worker_connections }}ansible自定义变量需要在vars下指定变量值 } http { 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; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096;
编写变量
vars只添加自定义变量文件 只要是自定义变量就应该添加在这里
vim vars/main.yaml worker_connections: 10241 添加 这里是你设置的自定义变量指定值为多少金甲模版就会应用
编写处理程序
handlers相当于触发器和任务里的notify起到关联作用
vim /root/roles/nginx/handlers/main.yaml --- - name: restart nginx service: name=nginx state=restarted
编写总剧本
vim /root/roles/site.yaml - hosts: webserver 应用到webserver主机组 roles: - nginx 这是文件名称,你的roles目录下nginx目录叫什么就要写什么
实施
进入roles目录 ansible-playbook site.yaml --syntax-check 语法测试 ansible-playbook site.yaml 执行 访问:http://192.168.23.11:80
练习题
如何在ansible中,使用不同的用户登录不同的主机?
在主机清单中指定不同主机的用户名密码
vi /etc/ansible/hosts ## db-[99:101]-node.example.com [webserver] host1 ansible_ssh_user='aaa' ansible_ssh_pass='hanqingdian666' ansible_ssh_port='2222' host2 ansible_ssh_user='bbb' ansible_ssh_pass='hanqingdian666'
如何加密hosts主机清单文件
ansible-vault encrypt /etc/ansible/hosts New Vault password: 设置加密密码 Confirm New Vault password: 重新输入加密密码 Encryption successful cat /etc/ansible/hosts 查看加密之后主机清单文件样式 $ANSIBLE_VAULT;1.1;AES256 35313261613633343933623363633835396238356566376165653365666235613262326533363864 6631616566323864303335303731663236323763636430620a623664343432353435323966353665 61656163323435333335613635396634636231323630626131316233346436356461323162323262 6439366565646264390a376132653538366361363265396439303833623335653461636139313437 64336631626232613466336430343731313931363939326634303338656561616230336232646666 61346264336135633630356561303364316236306164353665376463363538326234353738343964 64636432386364333532366565313837376463306563333330383162623763613038623839623863 35363264663266346131653332373962343939323034633433363263326538316364353435393331 [root@ansible ~]#ansible-vault decrypt /etc/ansible/hosts 进行解密 [root@ansible ~]# cat /etc/ansible/hosts 解密之后进行查看 ## db-[99:101]-node.example.com [webserver] host1 ansible_ssh_user='aaa' ansible_ssh_pass='hanqingdian666' ansible_ssh_port='2222' host2 ansible_ssh_user='bbb' ansible_ssh_pass='hanqingdian666'
在进行测试会出现报错
[root@ansible ~]# ansible webserver -m ping -o [WARNING]: * Failed to parse /etc/ansible/hosts with yaml plugin: Attempting to decrypt but no vault secrets found [WARNING]: * Failed to parse /etc/ansible/hosts with ini plugin: Attempting to decrypt but no vault secrets found [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' [WARNING]: Could not match supplied host pattern, ignoring: webserver
判断主机地址为192.168.23.11的主机。关闭该主机
- hosts: webserver tasks: - name: "shut down 192.168.23.11 systems" command: /usr/sbin/init 0 when: ansible_all_ipv4_addresses == "192.168.23.11" 关闭两台 - hosts: webserver tasks: - name: "shut down 192.168.23.11 192.168.23.12 systems" command: /usr/sbin/init 0 when: (ansible_all_ipv4_addresses == "192.168.23.11") or(ansible_all_ipv4_addresses == "192.168.23.12")
循环创建多个用户
- hosts: webserver tasks: - name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~