通过ansible下发单个任务,这种执行方式:Ad-hoc,点对点!临时任务,不复杂任务
1. mkdir httpd && cd httpd && vim httpd.yml -----创建目录,进入目录,编辑文件
2. 读取playbook文件执行任务!后缀.yml或.yaml
3. ansible-playbook httpd.yml -----执行playbook文件
4. ansible-playbook --syntax-check httpd.yml ----语法检测
格式:
---
- hosts: webservers #主机组
tasks:
- name: "安装apache"
yum: name=httpd state=latest
- name: "启动apache"
service: name=httpd state=started enabled=yes
查看ansible主机中远程主机信息
[root@localhost httpd]# ansible webservers --list-hosts
hosts (1):
192.168.179.131
修改任务返回success颜色:
[root@localhost ~]# vim /etc/ansible/ansible.cfg -----编辑配置文件
[colors]
ok=purple #改为紫色
定义变量:
在playbook文件中可以使用vars元素来定义变量
==例如:定义一个名为port的变量,值为80==
---
- hosts: nginx
vars:
port: 80
在playbook的任何位置都可以引用变量,变量需要加{ {}} 引用例如
---
- hosts: nginx
vars:
port: 80
tasks:
- name: "监听端口{
{ port }}"
shell: echo "{
{ port }}"
## 在模板文件中引用变量
定义变量
---
- hosts: webservers
vars:
port: 8000
tasks:
- name: "发送文件"
template: src=port.conf.j2 dest=/opt/port.conf
引用变量,编辑模板文件ort.conf.j2,通过template模块变量读入到模板文件中,并将文件发送至被管理节点
# vim port.conf.j2
{
{
port }}
我们也可以直接引用setup模块的关键词,当作变量,无需定义!
例如:
{
{
ansible_hostname }}
给任务打标签:
tags
一个任务可以拥有多个标签
例子:
- name: "创建测试页面"
shell: echo "nginx" > {
{
ngx_root }}/index.html
tags:
- page
使用标签:
[root@localhost ~]# ansible-playbook -t page nginx.yml
handlers:
handlers可以定义一些触发任务,这些任务可以被其他任务引用!这些触发任务只会在引用的任务有更改时执行!
handlers定义的触发任务,一般要写到文件的末尾!在其他任务中通过(notiy: 触发任务名称)引用
例子:
tasks:
- name: "推送模板配置文件"
template: src=nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf
tags:
- config-nginx
notify: reload-nginx
handlers:
- name: "reload-nginx"
shell: /usr/local/nginx/sbin/nginx -s reload
案例1
源码部署nginx的playbook文件内容,仅供参考
---
- hosts: webservers
vars:
ngx_root: /html
ngx_port: 8000
ngx_user: www
tasks:
- name: "安装依赖环境"
yum: name=gcc,pcre-devel,openssl-devel state=latest
- name: "分发nginx源码安装包"
unarchive: src=nginx-1.18.0.tar.gz dest=/root/
- name: "安装nginx"
shell: cd /root/nginx-1.18.0 && ./configure && make && make install
- name: "启动nginx"
shell: /usr/local/nginx/sbin/nginx
ignore_errors: True
- name: "推送模板配置文件"
template: src=nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf
tags: config-nginx
notify: reload-nginx
- name: "创建运行用户"
user: name={
{
ngx_user }}
tags: config-nginx
- name: "创建网站根目录"
file: path={
{
ngx_root }} state=directory group={
{
ngx_user }} owner={
{
ngx_user }}
tags: config-nginx
- name: "创建测试页面"
shell: echo "{
{ ngx_root }}" > {
{
ngx_root }}/index.html
tags:
- page
- config-nginx
handlers:
- name: "reload-nginx"
shell: /usr/local/nginx/sbin/nginx -s reload
---
- hosts:
tasks:
- name: "安装lamp相关组件"
yum: name={
{
item }} state=latest
with_items:
- php
- php-mysql
- php-gd
- mysql
- mysql-server
说明: item会依次等于php php-mysql php-gd mysql mysql-server,会循环执行5次
用when来给任务添加条件,当满足条件才能执行任务,不满足的节点不执行
例子:
---
- hosts: webservers
tasks:
- name: "满足主机名为:node-161,创建node-161.txt文件"
file: path=/opt/node-161.txt state=touch
when: ansible_hostname == "node-161"
- name: "满足主机名为:node-162,创建node-162.txt文件"
file: path=/opt/node-162.txt state=touch
when: ansible_hostname == "node-162"