一同养成写作习惯!这是我参与「日新计划 4 月更文应战」的第1天,点击检查活动详情。
假设做过运维或许网站开发的朋友,必定接触过服务布置,那么一般的服务布置流程是什么呢?找一台Linux机器,装置好运转环境所需求的软件,然后把服务布置上去。一台机器能够这么做,假设是集群呢?每一台都要这么做。假设咱们办理了几百台机器,突然有一天公司要求在一切机器上都装置某一款软件,那么手动明显是不行的,这个时分就有必要要凭借主动化脚原本完结这项使命了。
主动化履行的方法有许多种,最原始的便是shell脚本,可是明显它不能满足咱们的需求。常见主动化装备办理工具有许多种,slatstack和ansible是比较流行的两种,并且它们都是用python开发的,可是相对来讲ansible的优势愈加明显,首要是因为它拥有许多的模块和插件,并且你在GitHub和gitee上也能够找到许多他人写好的编列剧本,根本拿过来就能够运用了。
Ansible简介
尽管我认为当你看这篇文章的时分,或许对ansible有了至少一丁丁了解,可是简略的介绍还是要说一下的。Ansible是一个开源装备办理工具,能够运用它来主动化使命,布置应用程序完成IT根底架构。Ansible能够用来主动化日常使命,比方,服务器的初始化装备、安全基线装备、更新和打补丁体系,装置软件包等。
Ansible装置
- Centos
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum install -y ansible
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible
- pip装置
pip install ansible
pip这种方法是最便利的,究竟咱们一般都装置了Python,可是或许会有一个问题,装置完今后,咱们找不到装备文件,运用ansible –version检查发现config file是none,导致咱们没法正常运用,这是为什么呢?因为ansible加载装备文件的途径是有次序的。
ansible.cfg文件加载次序
ansible.cfg文件作为装备文件,ansible会在多个途径下进行读取,读取的次序如下:
- ANSIBLE_CONFIG:环境变量
- ansible.cfg:当时履行目录下
- .ansible.cfg:~/.ansible.cfg
- /etc/ansible/ansible.cfg
所以引荐运用方法是创立一个工程目录,将一切的装备文件都放置在此目录下,这样更便利移植。在ansible.cfg中有如下内容:
[defaults]
inventory = ./hosts
host_key_checking = False
所以咱们运用pip装置后,在主机上经过find指令查找到ansible.cfg,默许会装置到python目录下,将其复制到当时履行目录即可。
装备文件有三个:
- ansible.cfg –ansible的装备文件,一般咱们都运用默许装备,只需求改增加一个host_key_checking=False,不运用指纹验证。指纹验证便是当咱们在一台Linux机器上ssh登录另一台Linux时,第一次衔接会让咱们输入Yes/No
- hosts –主机文件清单
- roles –一个装备人物的文件夹,默许里面是空的
装备Ansible主机清单
清单装备中文文档
主机清单通常用来界说要办理的主机信息,包括IP、用户、暗码以及SSH key装备。能够分组装备,组与组之间能够装备包括联系,使咱们能够按组分配操作主机。装备文件的途径为:/etc/ansible/hosts
基于暗码的方法衔接
vim /etc/ansible/hosts
# 方法一
[web]
192.168.133.111 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.133.112 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.133.123 ansible_ssh_user=root ansible_ssh_pass=123456
# 方法二
[web]
192.168.133.111
192.168.133.112
192.168.133.123
[web:vars]
ansible_ssh_user=root ansible_ssh_pass=123456
# 方法三
[web]
192.168.133.111
192.168.133.112
192.168.133.123
# 在/etc/ansible目录下创立目录group_vars,然后再创立文件web.yml,以组名命名的yml文件
vim /etc/ansible/group_vars/web.yml
# 内容如下
ansible_ssh_user: root
ansible_ssh_pass: 123456
测验指令
ansible web -a 'ls /'
基于SSH key方法衔接
以下指令均在ansible主机履行,无需到被办理机器操作
# 生成ssh key,一路回车,默许生成在/root/.ssh目录下id_rsa和id_rsa.pub
ssh-keygen
# 将公钥复制到方针主机
ssh-copy-id root@192.168.143.132
# 履行以上句子,并输入暗码,会在方针主机生成一个文件/root/.ssh/authorized_keys
# 之后再衔接方针主机就不需求暗码了
ad-hoc指令
ad-hoc是暂时指令,就像咱们履行的shell指令相同,履行完即结束,ad-hoc形式的指令格局如下:
ansible web -m command -a 'df -h'
指令解说:
- ansible:指令
- web:主机名/IP/分组
- -m:指定模块(默许是command,所以能够把-m command这个去掉)
- command:模块名称
- -a:模块参数
- ‘df -h’:参数值
履行指令回来的结果颜色代表的含义:
绿色:被办理端没有被修正
黄色:被办理端发生改变
红色:履行呈现故障
常用模块介绍
ansible官方存在许多的模块,咱们运用ansible首要运用的也是因为它有许多的模块和插件,虽然模块许多,可是咱们常用的模块就那么几种,下面介绍以下常用模块:
yum指令
示例:
# 装置最新版的Apache
ansible web -m yum -a "name=httpd state=latest"
# congepel仓库装置罪过的Apache
ansible web -m yum -a "name=httpd state=latest enablerepo=epel"
# 删除Apache软件包
ansible web -m yum -a "name=httpd state=absent"
copy指令
示例:
# 复制apache装备文件到方针机器
ansible web -m copy -a "src=httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"
# 复制apache装备文件到方针机器,并备份方针文件
ansible web -m copy -a "src=httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"
# 在长途主机创立一个文件并写入内容
ansible web -m copy -a "content=HelloWorld dest=/home/index.html"
get_url指令
# 下载文件到本地
ansible web -m get_url -a "url=http://xx.xx.xx/ssss.txt dest=/home/xx.txt mode=655"
file指令
# 创立文件
ansible web -m file -a "path=/home/aaa.txt state=touch"
# 创立目录
ansible web -m file -a "path=/home/test state=directory"
# 递归修正目录权限
ansible web -m file -a "path=/home owner=nginx group=nginx mode=766 recurse=yes"
git指令
以上是部分常用模块的解说与示例,因为ansible的模块和参数许多,咱们就不做具体解说了。可是这儿要说一个十分十分重要的一点,以上全都是废话,任何一个模块,ansible都为咱们供给了十分具体的解说文档,例如检查cron模块的用法,查询指令如下:
ansible-doc cron
不仅有参数解说,还有履行示例:
假设想查询都有哪些模块,ansible-doc -l > ansible.doc,当然了,履行示例是依照ansible-playbook的方法显现的,可是咱们略微改一下就能够用ad-doc的方法履行了
报错处理
[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: oldboy
这个问题一般是没有在ansible.cfg内指定主机清单文件导致的,装备正确的inventory途径即可,还能够经过在ansible指令后边加-i来指定。
playbook
Playbook 与ad-hoc 相比,是一种彻底不同的运用ansible的方法,相似于saltstack的state状况文件。ad-hoc无法耐久运用,playbook能够耐久运用。playbook是由一个或多个play组成的列表,play的首要功能在于将事前归并为一组的主机装扮成事前经过ansible中的task界说好的人物。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即能够让它们联合起来按事前编列的机制完结某一使命。
Playbook是经过yml语法进行编列的,运用起来十分简略,咱们只需求知道一些根本的关键字就能够完成了。
- hosts:
- tasks:
- vars:
- templates:
- handlers:
- tags:
下面给一个简略的比方:
# httpd.yaml
- hosts: web
tasks:
- name: install httpd server
yum: name=httpd state=present
- name: configure httpd server
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: configure httpd server
copy: src=index.html dest=/var/www/html/index.html
- name: service httpd server
service: name=httpd state=started enabled=yes
这是一个装置Apache、装备、发动的流程,咱们看一下其中的关键字。
- hosts:需求履行的主机、组、IP
- tasks:履行的使命
- name:使命描绘
- yum/copy/service:履行模块(上面咱们介绍过的)
这便是最根底的Playbook的结构,也是一个Playbook所必备的结构,当然还有更多高级的操作,咱们下面经过更多的示例来给大家解说。
搭建nginx服务
- hosts: web
vars:
hello: Ansible
tasks:
# 装备软件源
- name: Configure Yum Repo
yum_repository:
name: nginx
description: nginx repo
baseurl: http://nginx.org/packages/centos/7/$basearch/
gpgcheck: yes
enabled: yes
# 装置nginx
- name: Install Nginx
yum: name=ningx state=present
# 替换装备文件
- name: Configure Nginx
copy:
src: nginx.conf
dest: /etc/nginx/conf/nginx.conf
# 修正首页
- name: Change Home
copy:
content: "Hello {{hello}}"
dest: /var/www/html/index.html
# 发动nginx
- name: Start Nginx
service:
name: nginx
state: started
上面这个比方在模块运用时,我用了两种比方
yum: name=nginx state=present
copy:
src: nginx.conf
dest: /etc/nginx/conf/nginx.conf
这两种方法都是能够的,只是写法不同,期望不要有人被误导,别的在这儿比方中咱们还引进了下一个知识点-变量
Ansible中的变量
为什么要运用变量?
首要咱们要清晰为什么运用变量?变量这个词在编程当中常常用到,咱们一向强调在编程中不要运用魔法数字,尽量运用宏或许变量代替,魔法数字一方面意义不够清晰,别的一方面在修正的时分,要涉及到许多当地,会呈现疏忽。那么在ansible中运用变量的意义也是相同的,清晰意义、便利修正。
怎样界说变量和运用变量?
- 在playbook文件中的hosts下运用vars进行界说
- 在playbook文件中直接界说变量
- hosts: web
vars:
web_pack: httpd-2.4.6
ftp_pack: vsftpd
# - web_pack: httpd-2.4.6 与上面等同
tasks:
- name: Install {{pack_name}}
yum:
name:
- "{{web_pack}}"
- "{{ftp_pack}}"
state: present
- 额外界说一个变量文件
假设是在多个文件中运用同样的变量,能够界说一个变量文件,在playbook中运用vars_files中引进即可
# vars.yml
web_pack: httpd-2.4.6
ftp_pack: vsftpd
- hosts: web
vars_files:
- ./vars.yml
- 在主机清单文件中进行界说
- 在主机清单文件中界说
# hosts
[web]
192.168.143.122
[web:vars]
pack_name=httpd
# playbook中运用,能够直接运用,假设当时文件中搜索不到,就去主机清单中搜搜
- hosts: web
tasks:
- name: install {{pack_name}}
yum: name={{pack_name}} state=present
- 独自界说group_vars和host_vars目录
group_vars是为组界说的变量目录,其下文件名为组名,例如group_vars/web,host_vars是为主机界说的变量目录,其下文件名为IP,例如host_vars/192.168.143.122。
留意:默许状况下,group_vars目录中文件名与hosts清单中的组名保持一致,因而在运用的时分,只对本组有用,其他组不能运用,可是体系还供给了一个特别的组-all,在group_vars新建一个all文件,一切组都能够运用
# web文件
pack_name: httpd
- 履行playbook时运用-e参数指定变量
ansible-playbook httpd.yml -e "pack_name=httpd" -e "hosts=web"
hosts变量经过-e传递是比较常见的,咱们能够区别测验环境和出产环境,当然你也能够界说不同的文件来区别
ansible 变量的优先级
上面咱们介绍了多种变量的界说方法,那么假设在多个当地界说了相同的变量,优先会运用哪个呢?这就涉及到变量优先级的问题了。
- 经过履行指令传递的变量
- 在playbook中引进vars_files中的变量
- 在playbook中界说的vars变量
- 在host_vars中界说的变量
- 在group_vars中组名文件中界说的变量
- 在group_vars中all文件中界说的变量
ansible resister注册变量
在咱们运用ansible-playbook的时分,它的输出是固定的格局的,假设咱们发动了httpd服务今后,想要看一下这个服务的状况,咱们不能登录到方针主机去检查,那么ansible有什么方法能够检查吗?
- hosts: web
tasks:
- name: install httpd server
yum: name=httpd state=present
- name: service httpd server
service: name=httpd state=started enabled=yes
- name: check httpd state
shell: ps aux|grep httpd
register: httpd_status
- name: output httpd_status variable
debug:
msg: "{{httpd_status}}"
上面是输出了一切的内容,假设需求输出部分内容,只要用变量.特点就行了,特点便是msg下的字典
ansible facts变量的意义
这是咱们装置Apache的打印,能够看到分为几个进程:PLAY、TASK、PLAY RECAP,在TASK的第一个打印咱们看到是Gathering Facts,可是咱们并没有增加这个使命,这是ansible主动为咱们增加的,这个使命是做什么用的呢?咱们在履行的进程中发现这一块履行时间还比较长。这个使命的首要作用是获取方针主机的信息,咱们看一下都能获取哪些信息,能够经过以下句子打印:ansible web -m setup
包括CUP、内存、硬盘、网络、主机名、绑定信息、体系版别信息等等,十分多的信息,这些信息都能够在playbook中当做变量运用。
- hosts: web
tasks:
- name: Query Host Info
debug:
msg: IP address is {{ansible_default_ipv4.address}} in hosts {{ansible_distribution}}
那么这个能够在什么状况下运用呢?例如依据方针主机的CPU数,装备nginx并发进程数量,当然假设不运用,咱们也能够封闭它。
- hosts: web
gather_facts: no
tasks:
- name: install httpd server
yum: name=httpd state=present
- name: service httpd server
service: name=httpd state=started enabled=yes
下面看一个比方:装置memcache
# memcache.yml
- hosts: web
tasks:
- name: install memcached server
yum: name=memcached state=present
- name: configure memcached server
template: src=./memcached.j2 dest=/etc/sysconfig/memcached
- name: service memcached server
service: name=memcached state=started enabled=yes
- name: check memcached server
shell: ps aux|grep memcached
register: check_mem
- name: debug memcached variables
debug:
msg: "{{check_mem.stdout_lines}}"
# memcached.j2,经过facts获取的方针主机内存总量
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ansible_memtotal_mb // 2}}"
OPTIONS=""
这儿咱们用到了一个新的模块:template,这个相当于Django的模板语法,支撑Jinjia2烘托引擎和语法。以上完成了playbook的大部分操作,可是那只是常规操作,还有一些愈加灵活的问题需求处理,例如:
咱们只想要履行一个playbook中的某个使命?
检测nginx状况,假设正常就发动或重启,不正常就疏忽,履行其他使命
假设nginx的装备文件没有改变,咱们就不履行发动或重启指令
以上这些状况都需求进行逻辑判别,ansible强壮的当地也正是这儿,下面咱们看一下task的使命操控流程
Task使命操控
使命操控包括以下逻辑关键字:
- 条件判别 when
- 循环句子 with_items
- 触发器 handlers
- 标签 tags
- 包括 include
- 疏忽错误 ignore_error
- 错误处理 change
条件判别
假设咱们装置Apache,在centos上装置的是httpd,在Ubuntu上装置的是httpd2,因而咱们需求判别主机信息,装置不同的软件。
- hosts: web
tasks:
- name: Install CentOS Httpd
yum: name=httpd state=present
when: ( ansible_distribution == "CentOS" )
- name: Install Ubuntu Httpd
yum: name=httpd2 state=present
when: ( ansible_distribution == "Ubuntu" )
给task加上when条件,在履行的时分,就会先判别条件是否满足,假设满足则履行使命,不满足就不履行此使命。咱们再看一个比方:假设Apache服务不正常就重启,不然越过。
- hosts: web
tasks:
- name: check httpd server
command: systemctl is-active httpd
register: check_httpd
- name: httpd restart
service: name=httpd state=restarted
when: check_httpd.rc == 0
循环指令 with_items
发动多个服务,例如nginx、httpd
- hosts: web
tasks:
- name: Service Start
service: name={{item}} state=restarted
with_items:
- nginx
- httpd
复制多个装备文件
- hosts: web
tasks:
- name: Copy Configure File
copy:
src: {{item.src}}
dest: {{item.dest}}
mode: {{item.mode}}
with_items:
- { src: './nginx.conf', dest: '/etc/nginx/conf/nginx.conf' }
- { src: './httpd.conf', dest: '/etc/httpd/conf/httpd.conf' }
触发器 handlers
当某个使命发生改变时,触发另一个使命的履行,例如假设httpd的装备文件发生了改变,就履行重启使命
- hosts: web
tasks:
- name: install httpd server
yum: name=httpd state=present
- name: configure httpd server
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: # 条用名称为Restart Httpd Server的handlers,能够写多个
- Restart Httpd Server
- name: service httpd server
service: name=httpd state=started enabled=yes
handlers:
- name: Restart Httpd Server
service: name=httpd state=restarted
handlers履行的时分需求留意,虽然是在某个使命被触发的,可是它有必要等到一切的task履行完结后,才会履行handlers里面被触发过的指令,假设在履行前,有另一个task履行失利了,那么被触发的handlers也不会履行。
tags标签
对使命指定标签后,咱们在运用ansible-playbook履行的时分就能够指定标签来履行使命,不需求履行一切的使命,标签的设置有三种状况:1. 一个使命设置一个标签 2.一个使命设置多个标签 3. 多个使命设置一个标签
- hosts: web
tasks:
- name: install httpd server
yum: name=httpd state=present
tags: install
- name: configure httpd server
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: # 条用名称为Restart Httpd Server的handlers,能够写多个
- Restart Httpd Server
tags: configure
- name: service httpd server
service: name=httpd state=started enabled=yes
tags: start
handlers:
- name: Restart Httpd Server
service: name=httpd state=restarted
履行指定tags的指令:ansible-playbook httpd.yml -t “configure”
越过指定tags的指令:ansible-playbook httpd.yml –skip-tags “install”
include包括
咱们能够把使命独自写在一个yaml文件中,然后在其他需求用到的使命中经过include_tasks: xxx.yml引进,举例如下:
# a.yml
- name: restart httpd service
service: name=httpd state=restarted
# b.yml
- hosts: web
tasks:
- name: configure httpd server
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: restat httpd
include_tasks: ./a.yml
当然咱们也能够把两个完整的playbook合并起来
# a.yml
- hosts: web
tasks:
- name: install httpd server
yum: name=httpd state=present
# b.yml
- hosts: web
tasks:
- name: configure httpd server
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
# total.yml
- import_playbook: ./a.yml
- import_playbook: ./b.yml
在履行total.yml的时分,实践上便是先履行a.yml,然后再履行b.yml,里面的内容实践并不是真实的合并
疏忽错误ignore_errors
咱们知道,在履行playbook的时分,假设其中某个使命失利了,它下面的使命就不会再履行了,可是有时分咱们并不需求一切使命都成功,某些使命是能够失利的,那么这个时分就需求进行容错,便是在这个使命失利的时分,不影响它后边的使命履行。
- hosts: web
tasks:
- name: check httpd status
command: ps aux|grep httpd
register: httpd_status
ignore_errors: yes # 假设查询句子履行失利,继续向下履行重启使命
- name: restart httpd
service: name=httpd state=restarted
错误处理
- force_handlers: yes 强制调用handlers只要handlers被触发过,无论是否有使命失利,均调用handlers
- hosts: web
force_handlers: yes
tasks:
- name: install httpd
yum: name=httpd state=present
- name: install fuck
yum: name=fuck state=present
handlers:
- name: restart httpd
service: name=httpd state=restarted
- change_when
当使命履行的时分,假设被控主机端发生了改变,change就会改变,可是某些指令,比方一些shell指令,只是查询信息,并没有做什么修正,可是一向会显现change状况,这个时分咱们就能够强制把change状况关掉。
- hosts: web
tasks:
- name: test task
shell: ps aux
change_when: false
再看一个比方,假设咱们修正装备文件成功了,就履行重启指令,不然不履行重启
- hosts: web
tasks:
- name: install nginx server
yum: name=nginx state=present
- name: configure nginx
copy: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf
# 履行nginx检查装备文件指令
- name: check nginx configure
command: /usr/sbin/nginx -t
register: check_nginx
changed_when: ( check_nginx.stdout.find('successful') )
- name: service nginx server
service: name=nginx state=restarted
Jinja模板
jinja模板是相似Django的模板,假设做过Django的同学应该是比较了解的,咱们运用jinja来装备一下nginx的负载均衡。
- hosts: web
vars:
- http_port: 80
- server_name: web.com
tasks:
- name: instal nginx server
yum: name=nginx state=present
- name: configure nginx
template: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf
- name: start nginx
service: name=nginx state=started enabled=yes
要使Jinja语法生效,有必要运用template模块处理,这个模块和copy相似,可是它支撑Jinja语法烘托
# nginx.conf
upstream {{server_name}} {
{% for i in range(2) %}
server 192.168.143.12{{i}}:{{http_port}};
server 192.168.143.12{{i}}:{{http_port}};
{% endfor %}
}
server {
listen {{http_port}};
server_name {{server_name}}
location / {
proxy_pass http://web.com;
include proxy_params;
}
}
在装备文件中就能够运用playbook中界说的变量,咱们在装备MySQL主从复制集群的时分,对于my.cnf文件,master主机和slave主机的装备是不同的,这样就能够依据主机名,运用Jinja中的if语法进行条件烘托
[mysqld]
{% if ansible_fqdn == "mysql_master" %}
log-bin=mysql-bin
server-id=1
{% else %}
server-id=2
{% endif %}
这样就完结了装备区别,履行同样的template复制指令,在不同的机器上是不同的装备文件。PS:
ansible_fqdn: 这个是gather_facts使命获取的变量,咱们也能够运用其他变量进行判别mysql_master: 这个是需求装备主从复制的master主机hostname,需求提前设置,也是能够用ansible设置的
Ansible Roles
最终咱们要讲一下ansible中最重要的一个概念-roles,假设前面的你都搞清楚了,那么roles是十分简略的。总的来说roles便是把咱们前面讲过的东西进行了一个排版,它规则了严格的目录格局,咱们有必要依照目录结构和文件名进行创立,不然它的文件体系就加载不到。目录格局如下:
- mysql.yml:playbook文件
- mysql:roles目录,也是人物名
- files:寄存文件、压缩包、装置包等
- handlers:触发使命放在这儿
- tasks:具体使命
- templates:寄存经过template烘托的模板文件
- vars:界说变量
- meta:使命依赖联系
那些main.yml也是有必要的,姓名有必要是这样,目录名称也有必要相同,可是不是每个目录都是有必要的,下面咱们把httpd的那个比方用roles写一下:
- hosts: web
tasks:
- name: install httpd server
yum: name=httpd state=present
tags: install
- name: configure httpd server
template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: # 条用名称为Restart Httpd Server的handlers,能够写多个
- Restart Httpd Server
tags: configure
- name: service httpd server
service: name=httpd state=started enabled=yes
tags: start
handlers:
- name: Restart Httpd Server
service: name=httpd state=restarted
就把上面这一段改成roles的格局,目录结构如下:
# httpd/handlers/main.yml
- name: Restart Httpd Server
service: name=httpd state=restarted
# httpd/tasks/config.xml
- name: configure httpd server
template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: # 条用名称为Restart Httpd Server的handlers,能够写多个
- Restart Httpd Server
tags: configure
# httpd/tasks/install.yml
- name: install httpd server
yum: name=httpd state=present
tags: install
# httpd/tasks/start.yml
- name: service httpd server
service: name=httpd state=started enabled=yes
tags: start
# httpd/tasks/main.yml
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: start.yml
# httpd1.yml
- hosts: web
roles:
- role: nginx
# - nginx 与上面是等价的,可是上面的能够增加tags
最终再与httpd1.yml同级目录下履行ansible-playbook httpd1.yml即可(我这儿实践是httpd2.yml,不要在意这些细节)
Galaxy
最终咱们再介绍一个官方网站:galaxy.ansible.com
这是一个相似GitHub和docker相同的网站,我的网太烂了,打不开,它上面是他人写好的roles,比方你想要装置Nginx,那么在上面搜索nginx,然后会供给一个下载指令:ansible-galaxy install geerlingguy.nginx,履行今后,会把它下载到/root/.ansible/roles这个目录下。
到这儿,ansible的解说咱们就写完了,ansible是用python开发的,所以咱们常常会把它和python结合起来运用,后边咱们会把python操作ansible写一下。