前言
最近在学习ansible自动化运维工具,在此记录一下学习笔记。
1.Ansible的介绍与安装
1.1 Ansible是什么?
Ansible是一种自动化运维工具,基于Python开发的,用于配置管理、应用部署、任务自动化和持续交付,采用YAML语言编写脚本(playbook),简单易用,广泛应用于DevOps和IT自动化领域。
1.2 Ansible的架构图

下面我手画了一个运行逻辑图:

简单介绍一下,操作方式代表用户可以通过playbook、云、CMDB或者直接自己操作ansible来操作主机组。
INVENTORY:Ansible管理的主机清单
MODULES:Ansible执行命令的功能模块
PLUGINS:模块功能的补充
API:供第三方程序调用的应用程序编程接口
1.3 安装Ansible
1.3.1 主控端
主控端就是执行ansible的主机,可以控制其他主机,在主控端安装ansible有两种主要的方式,一种是yum直接安装:
yum install ansible
另一种是用pip安装。
pip install ansible
注:windows不能做主控端
1.3.2 被控端
被控端是Linux系统:
ansible方便就方便在,被控端不需要安装什么其他的东西。但是在最新版本的ansible要求被控端的python版本为3.11及以上,我所有的操作都是基于最新版的ansible(目前最新版为2.18.6)。
下面列出ansible版本以及对应的被控端需求,你们可自行选择指定版本下载:
| Ansible版本 | 被控端python要求 | 说明 |
|---|---|---|
| < 2.11 | python2.7 或 python3.5 | 兼容python2和python3,被控端小于python2.4需要安装python-simplejson |
| 2.12 | python3.6+ | 开始弃用python2 |
| 2.14+ | python3.8+(强制) | 完全启用python2 |
被控端是windows系统:
我没做过windows被控端的设置,这里想要配置的可以自行查阅官方文档。
2.Ansible的部署
当我们成功安装ansible之后,在终端输入ansible --version,可以看到安装的ansible的版本及相关配置。(注: 如果是使用pip安装的ansible,那么你的配置文件是需要自己创建并编写的)

下面我会介绍ansible的一些相关文档
2.1 Ansible相关文档
2.1.1 配置文件
上面的图片里的config file就是ansible的主配置文件的地址,一般都是/etc/ansible/ansible.cfg。
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录(roles 会在后面讲到,是ansible中的重要概念)
2.1.2 ansible主配置文件
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_user = root #默认远程主机连接用户
#private_key_file = /path/to/private_key
#host_key_checking = True
#timeout = 10
2.1.3 inventory主机清单
ansible中为了批量的操作主机,需要在inventory file(默认是/etc/ansible/hosts)中添加主机ip。ansible是通过ssh连接被控端的,也就是说连接主机ip时使用的默认端口是22,如果你的被控主机端口不是22,需要在文件中指明,下面是一个主机清单的示例:
192.168.136.125 #普通主机配置
[webservers] #配置组,这样可以直接操作整组的被控机
192.168.136.129 ansible_python_interpreter=/usr/local/python3/bin/python3 #这里的参数配置是指定被控端的python地址
192.168.136.135
[dbsrvs]
192.168.136.[150:160] # 批量定义被控机的ip,即192.168.136.150-192.168.136.160
10.0.0.1:2222 #定义端口号
[appsrvs]
db-[a:f].example.com
如果你需要使用ansible,记得在 /etc/ansible/hosts 中添加被控端ip
3. Ansible相关工具
使用命令
which ansible来查看自己ansible相关工具的安装位置。
可以看到我这里ansible的相关工具的安装位置是/usr/local/bin,查看当前文件,可以看到ansible的相关工具:
介绍一下相关工具的用途:
ansible相关工具 用途 ansible 主程序,临时命令执行工具 ansible-doc 查看配置文档,模块功能查看工具 ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台 ansible-playbook 定制自动化任务 ansible-pull 远程执行命令的工具 ansible-vault 文件加密 ansible-console 基于console界面与用户交互的执行工具 利用ansible实现管理的主要方式:
- Ad-Hoc即直接利用ansible命令,主要用于临时命令使用场景。
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程。
3.1 ansible-doc
用来显示模块帮助
格式:
ansible-doc [options] [module...]
可加参数:
- l, --list #列出所有可用模块
-s,--snippet #显示指定模块的playbook片段
示例:
ansible-doc -l #列出所有可以使用的模块
可以看到,列出了可以使用的模块。我这里只截取了一部分,按方向键下,可以往下查看模块,按q退出模块查看。
ansible-doc ping #查看ping模块的帮助用法
ansible-doc -s ping #简述模块的用处
3.2 ansible
3.2.1 ansible工具的使用
此工具通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能。
使用此工具时,建议先配置ansible的主机端能基于密钥认证的方式联系各个被管理节点(后面会讲解如何配置),不然每次操控被控端时,都需要手动输入账号密码。
格式:
ansible <host-pattern> [-m module_name] [-a args]
host-pattern: 主机清单里中的主机,可以填写指定ip;也可以填写被控端所在组;也可以填写all,表示所有主机。
module_name: 表示模块名
args:添加的参数
选项说明:
--version #显示ansible版本及相关信息
-m module_name #指定模块
--list-hosts #显示主机列表,可简写为 --list
-v #显示详细过程
-k,--ask-pass #提示输入ssh连接密码,默认key验证
-c,--check #检查ansible代码是否能够执行成功,不执行
-T,--timeout=T #设置执行命令的超时时间,默认10秒
-u,--user=User #执行远程命令的用户
3.2.2 构建主机端与被控端的连接
因为ansible是通过ssh与被控端连接的,所以为了成功构建主机端与被控端的连接,我们要做两件事。
第一步,在ansible的配置文件中配置host_key_checking = False。配置这样的参数后,ansible就不会在第一次连接目标主机时进行主机密钥检查。也就是第一次使用ssh连接目标主机时,会出现的下面的提示:
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ECDSA key fingerprint is SHA256:xxxxx.
Are you sure you want to continue connecting (yes/no)?
但是我只推荐在测试环境取消这个配置,在生产环境,我们可以手动将目标主机添加到~/.ssh/known_hosts中,这样也不会触发主机密钥检查。
第二步,编写脚本进行ssh key配置,如果机器少也可以自己手动配置。其本质步骤就是生产密钥然后将公钥复制到远程主机。
# 设置你的远程主机列表
HOSTS=("192.168.1.100" "192.168.1.101")
# 远程主机登录用户名
REMOTE_USER="root"
# 本地私钥路径
PRIVATE_KEY_PATH="$HOME/.ssh/id_rsa"
# Ansible inventory 文件保存路径
INVENTORY_FILE="./hosts"
echo "开始配置 SSH Key..."
#检查 SSH 密钥对是否存在
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
echo "未找到 SSH 密钥,正在生成..."
ssh-keygen -t rsa -b 4096 -f "$PRIVATE_KEY_PATH" -P ''
else
echo "SSH 密钥已存在,跳过生成。"
fi
# 向每台主机分发公钥
for HOST in "${HOSTS[@]}"; do
echo "正在将公钥发送到 $HOST..."
ssh-copy-id -i "${PRIVATE_KEY_PATH}.pub" "$REMOTE_USER@$HOST" || {
echo "公钥复制到 $HOST 失败,请手动检查。"
exit 1
}
done
echo "测试连接是否成功..."
ansible -i "$INVENTORY_FILE" managed_hosts -m ping
注意,这个脚本每次都要自己手动输入密码。
3.2.3 ansible与主机的匹配
我们在使用ansible的时候,需要指定这些命令用到哪些主机上,下面将介绍各种主机匹配规则
ALL :表示所有Inventory中的主机
示例
ansible all -m ping #表示测试所有被控端的连通性
*:通配符(匹配任意)
ansible "*" -m ping #相当于ansible all -m ping
ansible 192.168.136.* -m ping #匹配所有以192.168.136.开头的主机
逻辑或(并集)
ansible all -i hosts -m ping --limit group1,group2 #表示执行group1和group2中所有的主机
逻辑与(交集)
ansible all -i hosts -m ping --limit group1\&group2 #表示执行group1和group2中共同拥有的主机
逻辑非
ansible all -i hosts -m ping --limit '!group2' #排除group2中的主机
组合示例
ansible all -i hosts -m ping --limit 'group1,group3:!group2' #同时属于group1和group2但是不属于group3
3.2.4 ansible命令的执行过程
- 加载自己的配置文件/etc/ansible/ansible.cfg
- 加载自己对应的模块文件
- 通过ansible将模块或命令生成临时py文件,并将该文件远程传输至对应执行用户
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,退出
3.3 ansible-galaxy
此工具会连接https://galaxy.ansible.com 下载相应的roles,我这里连不上外网,就不展示了。
示例:
ansible-galaxy list #列出所有已安装的galaxy
ansible-galaxy install ... #安装galaxy
ansible-galaxy remove ... #移除已安装的galaxy
3.4 ansible-pull
此工具会推送ansible的命令至远程。
3.5 ansible-playbook
此工具用于执行编写好的playbook任务。
3.6 ansible-vault
此工具用于加密yml文件。
ansible-vault [create(创建新文件)| decrypt(解密)|edit(编辑加密文件)|encrypt(加密)|rekey(修改口令)|view(查看)]
示例
加密yml文件:
加密的时候要输入两次一样的口令
查看加密文件:
解密yml文件:
其他就不演示了。
3.7 ansible-console
此工具可交互执行命令,支持tab

提示符格式:
执行用户@当前操纵的主机组(当前组的主机数量)[f:并发数]
可以使用的命令:forks n;cd 主机组;list;?或help
展示部分命令的使用:
list命令,显示当前组所有主机列表
forks n 设置并发数
4. ansible常用模块
4.1 command模块
功能:此模块的作用是在远程主机执行命令,这也是默认模块。
示例:
这个命令主要是在所有的主机下查询/data下的文件

注:该模块不支持管道符和重定向


可以看到,虽然它返回执行成功的标识,但当我们查找时,却并没有查找到,说明并没有创建成功。
原因:Ansible 的
command模块本质上是直接通过 Python 的subprocess执行命令,它不会经过/bin/sh或/bin/bash,所以不支持 Shell 语法。
那如果我们想使用管道符和重定向符怎么办?我们可以使用shell模块。
4.2 shell模块
功能:此模块用shell执行命令,支持shell语法。
示例:


可以看到管道符和重定向都可以通过shell模块来实现。
4.3 script模块
功能:在远程主机上运行ansible服务器上的脚本(本质就是把脚本传给目标机,再在目标机上运行)
示例:
创建一个tets2.sh的脚本,里面内容就是简单的打印。
![]()
使用script模块将该脚本传输到目标主机上运行,可以看到成功打印出信息

4.4 copy模块
功能:从ansible服务器主控端复制文件到远程主机(如果目标主机已经存在目标文件,默认会覆盖,可以指定文件备份)
示例:
这里的命令是将ansible主控端/root/test.sh 文件复制到被控端的/data/test2.sh backup是指定备份


我们可以看到,文件已经被复制到了被控端。
也可以直接指定内容,生成目标文件:


4.5 Fetch模块
功能:从远程主机提取文件至ansible主机端,不支持目录。
示例:

4.6 file模块
功能:设置文件属性
示例:
#创建空文件
ansible all -m file -a 'path=/data/test.txt state=touch'
#递归删除空文件
ansible all -m file -a 'path=/data/test.txt state=absent'
#修改文件属主和权限
ansible all -m file -a "path=/root/test.sh owner=wang mode=755"
#创建目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
#创建软连接
ansible all -m file -a "src = /data/testfile dest=/data/test-link state=link"
4.7 unarchive模块
功能:解包解压缩
两种用法:1.将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2.将远程主机上某个压缩包解压至指定目录,设置copy=no.
参数:copy,src,dest,mode,remote_src(与copy相反)
示例:
将主机上的压缩包解压到目标主机的/data文件下:

4.8 archive模块
功能:打包压缩
参数:path(源文件),dest(目标文件),format(文件格式),owner(文件属主),mode(文件权限)
示例:
ansible all -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=600'
4.9 hostname模块
功能:管理主机名
示例:
ansible 192.168.135.129 -m hostname -a "name=k8s-node1"
4.10 Cron模块
功能: 用于在远程主机上管理定时任务(分,时,日,月,周)
示例:
#创建任务
ansible all -m cron -a "minute=0 job=/opt/hourly_task.sh name='create job' " #每小时执行一次脚本
#删除任务
ansible all -m cron -a "name='create job' state=absent"
#禁用任务
ansible all -m cron -a "minute=0 job=/opt/hourly_task.sh name='create job' disabled=yes"
#启用任务
ansible all -m cron -a "minute=0 job=/opt/hourly_task.sh name='create job' disabled=no"
4.11 yum模块
功能:管理软件包,只支持centos,RHEL,不支持ubuntu其他版本.(不建议用,我用的时候一堆问题,不如直接用shell模块执行yum命令)
示例:
ansible all -m yum -a 'name=nginx state=present' #安装
ansible all -m yum -a 'name=nginx state=absent' #删除
4.12 service模块
功能:管理服务
示例:
ansible all -m service -a "name=nginx state=started enabled=yes" #启动nginx服务并且设置为开机自启
ansible all -m service -a "name=nginx state=stopped" #停止nginx服务
ansible all -m service -a "name=nginx state=reloaded" #重载nginx服务
ansible all -m service -a "name=nginx state=restarted" #重启nginx服务
4.13 user模块
功能:在远程主机上创建,修改或删除用户账号.
示例:
ansible all -m user -a "name=webadmin home=/home/webadmin create_home=yes" #创建用户并指定home目录
ansible all -m user -a "name=webadmin state=absent remove=yes" #删除用户并移除其home目录
4.14 Group模块
功能:在远程主机上创建,删除或管理用户组
示例:
ansible all -m group -a "name=devops gid=8888" #创建组并指定gid
ansible all -m group -a "name=devops state=absent" #删除组
4.15 Lineinfile模块
功能:用于在远程主机的文件中添加,替换,修改,注释或取消注释某一行
示例:
参数:path(目标文件路径),line(要添加或替换的完整内容行),regexp(匹配的正则表达式),insertafter(指定在哪一行后插入),insertbefore(指定在哪一行前插入),state[present(默认)表示要确保该行存在;absent表示确保改行不存在],create(文件不存在时是否创建,默认为no),backrefs(是否在使用正则时启动反向引用)
示例:
添加一行到配置文件,文件不存在时创建:

修改某一行,用正则

删除一行

4.16 Replace模块
功能:基于正则进行匹配和替换
示例:
ansible all -m replace -a 'path=/data/nginx.conf regexp="^#.*" replace="" ' #删除以#开头的注释行
4.17 setup模块
功能:收集远程主机的信息,并将这些信息作为变量供后续任务使用.
示例:
收集所有信息:

这里输出太多我就不展示了.
我们可以指定获取信息,例如我们指定获取主机名信息:

常见的有用的变量:
| 变量名 | 含义 |
|---|---|
| ansible_hostname | 主机名 |
| ansible_distribution | 操作系统名称 |
| ansible_distribution_version | 系统版本号 |
| ansible_default_ipv4.address | 默认ipv4地址 |
| ansible_memtotal_mb | 总内存(MB) |
| ansible_processor_cores | cpu核心数 |
5. ansible 中的playbook
5.1 什么是playbook?
playbook使用yaml语法编写的自动化脚本,是由一个或多个"play"组成的列表.
可以简单理解为批量部署手册的自动执行版本.
5.2 playbook的组成
- Hosts : 执行playbook的远程主机列表
- tasks: 任务集
- variables: 内置变量或自定义变量在playbook中调用
- tempates: 模板
- handlers和notify,两者结合使用,由特定条件触发的操作,满足条件方才能执行
- tags: 标签,指定某条任务执行
在定义task时,有两种形式:
- action:module arguments
- module:arguments (更推荐这个形式,简单易懂)
5.3 playbook编写
先写一个简单的playbook示例:
---
#install_nginx.yml
- hosts: all #目标用户组
remote_user: root #操作用户
#取消默认的收集
gather_facts: no
tasks:
- name: add group nginx
group:
name: nginx
state: present
- name: add user nginx
user:
name: nginx
state: present
group: nginx
- name: Install nginx
shell: yum install nginx -y #这里可以用yum模块
- name: start nginx
service:
name: nginx
state: started
enabled: yes
可以运行ansible-playbook install_nginx.yml -C 来检查playbook有没有语法错误,这不会运行到目标主机上.

可以看到,这个playbook的检查没有问题.
5.3.1 playbook中使用handlers和notify
这两个东西类似于数据库中的触发器的触发行为.简单来说,就是当用户做了特定的动作后,会触发一个特定的行为.
示例:
---
- hosts: all
remote_user: root
tasks:
- name: Install httpd
shell: yum install -y httpd
- name: Copy httpd config file #将主机端的配置文件复制到被控端
copy:
src: files/httpd.conf
dest: /etc/httpd/conf/
notify: restart service #这里设置一个触发器,当用户进行了修改配置文件的操作,就重启服务
- name: Start httpd service
service:
name: httpd
state: started
enabled: yes
handlers:
- name: restart service #这里名字一定要跟notify里面的对应上
service:
name: httpd
state: restarted
5.3.2 playbook中使用tags组件
tags组件的作用: 可以让我们在运行playbook时,只执行特定任务(或跳过特定任务)
示例:
---
- hosts: webserver
remote_user: root
tasks:
- name: 安装 nginx
yum:
name: nginx
state: present
tags: install #设置tags为install
- name: 配置文件
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx
tags: config
- name: 启动 nginx
service:
name: nginx
state: started
tags: start
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
tags: restart
配置了tags之后,我们就可以在命令行指定某一个标签运行或者跳过某一段标签
例如:
ansible-playbook site.yml --tags "install,config" #只运行install和config
ansible-playbook site.yml --t "install,config"
ansible-playbook site.yml --skip-tags "start" #跳过start任务
ansible-playbook site.yml --list-tags #查看playbook中有哪些tag
5.3.3 playbook中使用变量
变量名:仅能由字母、数字、下划线组成,且只能以字母开头
定义方式:variable=value,例如:http_port = 80
调用方式:{{ variable }}
定义变量的方式不止上面那一种,还有很多种:
- 使用setup里面的变量,在执行playbook时,如果不添加gather_facts: no(取消默认收集),playbook默认会收集目标主机的信息,这时候我们就可以使用setup里面的变量。
示例:
先编写一份playbook:
#use_setup_variable.yml --- - hosts: all remote_user: root tasks: - name: 创建以目标主机名命名的文件 file: name: /data/{{ ansible_hostname }} state: touch运行并查看结果:
- 在执行playbook时,使用 -e 添加变量
示例:
--- - hosts: all remote_user: root tasks: - name: 在data目录下创建指定文件 file: name: /data/{{ var }} state: touch运行并查看结果:
- 在playbook里面定义变量
示例:
--- #playbook中变量的创建与引用 - hosts: all remote_user: root vars: #定义变量 username: user1 groupname: group1 tasks: - name: create group group: name={{groupname}} state=present - name: create user user: name={{ username }} group={{ groupname }} state=present
- 使用变量文件
也就是在一个单独的yml文件中定义变量,然后在playbook中引用这个yml文件。
示例:
定义一个名为vars.yml的变量文件
#变量文件 --- package_name: vsftpd service_name: vsftpd--- #调用变量文件里定义的变量 - hosts: all remote_user: root var_files: - vars.yml tasks: - name: install package yum: name={{ package_name }} tags: install - name: start service service: name={{ service_name }} state=started enabled=yes
- 在主机清单中定义文件
[websrvs]
192.168.136.129 http_port=80 #这是单独定义一个主机
192.168.136.136
[websrvs:vars]
ntp_server=ntp.magedu.com #这是定义一个主机组的共同变量
5.4 playbook中的template模板
功能:可以根据和参考模块文件,动态生成相类似的配置文件
template文件必须存放于templates目录下,且命名时以.j2结尾(template模板使用jinja2语言)
yaml/yml文件必须和templates目录平级,目录结构如下:

示例:利用template同步nginx配置文件
#准备templates/nginx.conf.j2文件
- host: all
remote_user: root
tasks:
- name: template config to remote hosts
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
---
#可以先修改nginx.conf.j2 里面的配置。
#这里使用setup里面的变量动态配置nginx的工作进程
worker_process {{ ansible_processor_vcpus }}
也可以在配置文件里进行算术运行、条件判断等,这里就不细说了。
5.5 playbook中的条件判断
在playbook中,要想使用条件判断,可以使用关键字when。通过在task后添加when子句即可使用条件测试。
示例:
--- - hosts: all remote_user: root tasks: - name: 关闭k8s-node1上的nginx服务 service: name: nginx state: stopped when: ansible_hostname == 'k8s-node1'
5.6 playbook中使用迭代
当有需要重复性执行的任务时,可以使用迭代机制,对迭代的项目进行引用,固定变量名为:"item"。注:这个变量名只能为item
示例:
--- - hosts: all remote_user: root tasks: - name: add users user: name={{ item }} state=present with_items: - testuser1 - testuser2
6. ansible中的roles
作用:用于层次性、结构化地组织playbook。
roles:多个角色的集合,可以将多个role,分别放置roles目录下的独立子目录中。
6.1 roles默认存放位置
使用命令:ansible-galaxy list ;可以看到ansible默认存放的路径。
我们可以在这些目录下创建role,也可以自己创建roles目录,然后在这个roles目录下面实现role。
我们在创建role时,每个role下面有许多子目录,每个子目录有不同的作用。
6.2 roles各个目录的作用
roles/project(项目名称)/ 下面有以下子目录:
- files/:存放copy或script模块等调用的文件
- templates/:存放模板
- tasks/:定义task,role的基本元素,至少包含一个main.yml文件。
- handlers/:触发器
- vars/:定义变量
- meta/:定义当前角色的特殊设定及其依赖关系
- default/:设定默认变量时使用此目录中的main.yml文件,优先级比vars低。
roles 创建步骤:
- 创建以roles命名的目录。
- 在roles目录中分别创建以各角色名称命名的目录。
- 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建。
- 在playbook中,调用各角色
6.3 playbook调用角色
调用方法1:
直接roles调用。(注:playbook要跟roles处于同一级目录下)
---
- hosts: all
remote_user: root
roles:
- mysql
- nginx
调用方法2:
键role用于指定角色名称,后续的k/v用于传递变量给角色
---
- hosts: all
remote_user: root
roles:
- mysql
- {role: nginx , username: nginx}
调用方法3:
基于条件判断。
---
- hosts: all
remote_user: root
roles:
- mysql
- {role: nginx,when: ansible_hostname='k8s-node1'}
6.4 使用角色安装nginx
创建四个文件:handlers,tasks,templates
首先是tasks,创建五个文件,分别是:config.yml,file.yml,install.yml,main.yml,service.yml
每个文件的代码如下所示:
# config.yml 作用是在两个不同主机上配置两个不同的conf文件,同时匹配触发器
- name: config file for centos7
template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="7"
notify: restart
- name: config file for centos8
template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="8"
notify: restart
#跨项目角色调用
#这个跨角色调用一定要从roles开始(相对路径)
#跨项目将index网页复制到目标主机
#file.yml
- name: index.html
copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
#安装nginx install.yml
- name: install
yum: name=nginx
#service.yml
- name: start service
service: name=nginx state=started enable=yes
#main.yml 用来规定yml文件的执行顺序
- include: install.yml
- include: config.yml
- include: file.yml
- include: service.yml
然后是handlers,这里只定义了一个main.yml文件,内容如下:
- name: restart
service: name=nginx state=restarted
就是匹配之前的config.yml文件中的notify。
其次就是templates,这里面定义了nginx.conf的模板,定义了两个模板,本别是nginx7.conf.j2 nginx8.conf.j2。其实就是nginx.conf文件复制了两份,改了一下名字,同时将里面的worker_processes 配置为worker_processes {{ansible_processor_vcpus+2}};
最后就是playbook的编写:
#调用role文件
---
- hosts: all
remote_user: root
roles:
- nginx












1万+

被折叠的 条评论
为什么被折叠?



