ansible
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible相关的知识,希望对你有一定的参考价值。
Ansible
一、运维工具的分类
agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, ... agentless:基于ssh服务完成管理,ansible, fabric, ...
1、什么是ansible
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
参考站点:http://www.ansible.com.cn
2、ansible架构
Ansible Core:ansible自身核心模块 Modules: Core Modules:自带模块 Customed Modules:自定义模块 Host Iventory 主机清单,定义可管控的主机列表 Files:;通过配置文件定义 CMDB:使用外部存储装载要管理的主机来定义 PlayBooks:剧本,把需要完成的多个任务定义在剧本中 Hosts:定义的剧本角色 roles:定义好的任务功能由角色来完成 Connection Plugins:连接插件 ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件,尤其是要完成并发连接
3、ansible特性
模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍; 基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现; 不需要在被管理节点上安装客户端,只要有sshd即可,部署非常简单 支持自定义模块,使用任意编程语言; 强大的playbook机制; 幂等性;
ansible的安装和使用
ansible无服务器端,使用时直接运行命令即可,同时不需要在被管控主机上安装任何客户端,因此ansible是一个十分轻量级的工具,可以在epel源进行安装,ansible已经被红帽收购,相信不久会被收入base源配置好epel源后直接yum安装ansible
3.1、程序环境及主要配置文件
程序: ansible ansible-playbook ansible-doc 配置文件: /etc/ansible/ansible.cfg 主机清单: /etc/ansible/hosts 插件目录: /usr/share/ansible_plugins/ 配置Host Inventory示例: ]# cp hosts{,.bak}先做备份 # Ex 1: Ungrouped hosts, specify before any group headers.直接在任何组的头部前面指定,不属于任何组的主机 green.example.com blue.example.com 192.168.100.1 192.168.100.10 # Ex 2: A collection of hosts belonging to the ‘webservers‘ group一批主机属于一个组,例如定义为‘webservers‘的组,且一个主机可以属于多个组 [webservers] alpha.example.org beta.example.org 192.168.1.100 192.168.1.110
二、ansible应用程序命令格式
1.ansible-doc命令:获取模块列表,及模块使用格式;
ansible-doc -l:获取列表 ansible-doc -s module_name:获取指定模块的使用信息
2.命令格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args] <host-pattern> :指明管控主机,以模式形式表示或者直接给定IP,必须事先定义在文件中;all设置所有 <host-pattern>默认读取/etc/ansible/hosts,也可以指明自定义文件路径 -iPATH, --inventory=PATH:指明使用的host inventory文件路径; [-f forks] :指明每批管控多少主机,默认为5个主机一批次 [-m module_name] :使用何种模块管理操作,所有的操作都需要通过模块来指定 [-a args] :指明模块专用参数;args一般为key=value格式 注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可; 常用选项 -m MOD_NAME -a MOD_ARGS
3.ansible的连接:
通过前面的介绍我们知道,ansible是基于ssh协议来进行数据传输,ssh连接一般有两种方法,一种是使用密码密钥,一种是使用公私密码免密码登录,为了顺利使用ansible,下面配置基于公私密码免密码登录
1)生成密钥对 [[email protected]]# ssh-keygen -t rsa #-t表示使用的加密类型,其中rsa1表示version1版本,rsa、dsa、ecdsa的加密对于的是version2版本 Generating public/private rsa key pair. #这里询问你要把生成的密钥文件保存在哪里,默认是在家目录下的.ssh文件夹中,回车保存默认目录 Enter file in which to save the key (/root/.ssh/id_rsa): #这里是对密钥文件加密,不输入则表示不加密 Enter passphrase (empty for no passphrase): Enter same passphrase again: 2)查看已经成功生成了一对密钥 [[email protected] ~]# ls /root/.ssh id_rsa id_rsa.pub#其中id_rsa为私钥,id_rsa.pub为公钥 3)在生成完密钥对之后将公钥上传给服务器对应用户的家目录 [[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] [[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] [[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] 4)配置ansible需要控制的主机列表,其配置在hosts文件中: [websrvs] 192.168.25.139 [dbsrvs] 192.168.25.140 192.168.25.141
3.1inventory参数:主机库ssh参数设置
ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行;
ansible_ssh_port:指定ssh端口 ansible_ssh_user:指定ssh用户 ansible_ssh_pass:指定ssh用户登录是认证密码,明文密码不安全 ansible_sudo_pass:指明sudo时候的密码 示例: [websrvs] 192.168.25.139 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=ali 192.168.25.140 注意:在/etc/ansible/hosts中直接定义连接时候的密码不安全,一般建议基于ssh的密钥认证方式实现
4.常用模块
1)ping:探测目标主机是否存活;
[[email protected] ~]# ansible websrvs -m ping #指定一个主机组进行探测 [[email protected] ~]# ansible all -m ping #探测所有主机
2)command:默认模块,可省略。在远程主机上进行操作命令
-a ‘COMMAND‘
[[email protected] ~]# ansible all -m command -a "ifconfig" [[email protected]alhost ~]# ansible all -a "ifconfig"
3)shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ;
-a ‘COMMAND‘ 运行shell命令
[[email protected] ~]# ansible all -m shell -a "echo ‘1‘ |passwd --stdin root"
注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;
4)copy:复制文件到远程主机
用法:(1) 复制文件 -a "src= dest= "(2) 给定内容生成文件 -a "content= dest= "
[[email protected] ~]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640" [[email protected] ~]# ansible all -m copy -a "content=hello\nmyali\n dest=/tmp/myali.ansible mode=640"
5)file:文件管理
用法:(1) 创建目录:-a "path= state=directory" (2) 创建链接文件:-a "path= src= state=link" (3) 删除文件:-a "path= state=absent“
[[email protected] ~]# ansible all -m file -a "path=/tmp/fstab.ansible owner=centos" [[email protected] ~]# ansible all -m file -a "path=/tmp/fstab.ansible state=absent" [[email protected] ~]# ansible all -m file -a "path=/tmp/dir.ansible state=directory" [[email protected] ~]# ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible state=link"
6)cron:管理周期性计划任务
用法:-a ‘ minute= hour= day= month= weekday= job= name= user= state={present|absent}‘
[[email protected] ~]# ansible all -m cron -a "minute=‘*/5‘ job=‘/usr/sbin/ntpdate 192.168.15.128 &> /dev/null‘ name=‘sync time‘" [[email protected] ~]# ansible all -m cron -a "name=‘sync time‘ state=absent"
7)hostname:设置主机名
用法:name=
8)yum:使用yum包管理器完成程序包管理
用法:(1) -a "name= state={present|latest}" 安装程序包,(2) -a "name= state=absent" 删除程序包
[[email protected] ~]# ansible all -m yum -a "name=httpd" [[email protected] ~]# ansible all -m yum -a "name=httpd state=absent"
9)service:控制服务
用法:-a ‘name= state={started|stopped|restarted} enabled=(是否开机自动启动) runlevel=‘
[[email protected] ~]# ansible all -m service -a "name=httpd state=started enabled=true"
10)group:添加或删除组
用法:-a ‘name= state={present|absent} gid= system=(系统组)‘
[[email protected] ~]# ansible all -m group -a ‘name=mygroup state=present system=true‘
11)user:管理组帐号
用法:-a ‘name= state={present(创建)|absent(删除)} force=(是否强制操作删除家目录) system= uid= shell= home=‘
[[email protected] ~]# ansible all -m user -a ‘name=ansible state=present‘
12)script:运行脚本
用法:-a ‘/PATH/TO/SCRIPT‘运行脚本
[[email protected] ~]# ansible all -m script -a ‘/tmp/a.sh‘
13)setup:获取指定主机的facts变量;
[[email protected] ~]# ansible 192.168.25.139 -m setup
三、Playbooks剧本
playbooks是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行
1.playbook组织格式:YAML语言格式
YAML类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互
2.语法格式
1)任何数据结构都用缩进来标识,可以嵌套
2)每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ }和,分隔格式
3)列表用 – 标识
3Playbook
1)核心元素
Tasks:任务,由模块定义的操作的列表; Variables:变量 Templates:模板,即使用了模板语法的文本文件; Handlers:处理器,由特定条件触发的Tasks; Roles:角色;由多个自包含的完整的Tasks,Variables,Templates,Handlers...等等组成的操作的集合
2)基础组件:
Hosts:运行指定任务的目标主机; remote_user:在远程主机以哪个用户身份执行; sudo_user:非管理员需要拥有sudo权限; tasks:任务列表 列表由模块,模块参数组成如下: 格式: (1) action: module arguments (2) module: arguments
3)playbook定义任务: playbook的存储在*.yaml文本中,需要创建一个yaml文件
- name: task description 注释描述信息 module_name: module_args 声明模块:定义ansible模块参数
4)ansible-playbook执行命令:
(1) 检测语法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 测试运行 ansible-playbook -C /path/to/playbook.yaml --list-hosts --list-tasks --list-tags [[email protected] ~]# ansible-playbook --check --list-hosts --list-tasks group.yaml (3) 运行 ansible-playbook /path/to/playbook.yaml -t TAGS, --tags=TAGS:只运行标记了的任务 --skip-tags=SKIP_TAGS:跳过指定的标签所标记的任务 --start-at-task=START_AT:从指定的任务开始向后 运行
5)playbook---Variables 变量
1)变量命名:字母、数字和下划线组成,仅能以字母开头; 2)变量类型 内建: 1) facts:由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中;无须声明,可直接调用; 自定义变量: 1) 命令行传递;ansible-playbook test.yml --extra-vars "host=www user=test" 2) 在hosts Inventory中为每个主机定义专用变量值; a) 向不同的主机传递不同的变量 ; [websrvs] 192.168.25.139 host=mail 192.168.25.140 192.168.25.141 b) 向组内的所有主机传递相同的变量 ; [groupname:vars] variable_name=value 注意:组名要事先存在,实例如下: [websrvs] 192.168.25.139 192.168.25.140 [websrvs:vars] host=mail 3) 在playbook中定义 vars: - var_name: value - var_name: value 4) 在角色调用时传递 roles: - { role: ROLE_NAME, var: value, ...} 3)变量调用: {{ var_name }}
6)Templates:模板
文本文件,内部嵌套有模板语言脚本(使用模板语言编写)模板文件中可使用jinja2表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;
语法:
字面量: 字符串:使用单引号或双引号; 数字:整数、浮点数; 列表:[item1, item2, ...] 元组:(item1, item2, ...) 字典:{key1:value1, key2:value2, ...} 布尔型:true/false 算术运算: +, -, *, /, //, %, ** 比较操作: ==, !=, >, <, >=, <= 逻辑运算:and, or, not 执行模板文件中的脚本,并生成结果数据流,需要使用template模块; template模块格式: -a ”“ src= dest= mode= onwer= group= 注意:此模板不能在命令行使用,而只能用于playbook; 定义方法: 步骤1:在本地的nginx配置文件中写入fact变量名称 步骤2:在yam文件中使用template模版将nginx配置文件复制到远程主机,并且模版文件要以.j2结尾 步骤3:执行ansible-playbook xxx.yaml命令, 步骤4:在远程主机上测试查看配置文件中的变量名称传递过去的是否有值 示例:见后方;
7)条件测试
在某task后面添加when子句即可实现条件测试功能;when语句支持Jinja2语法;
有的时候在特定的主机需要跳过特定的步骤,例如在安装包的时候,需要指定主机的操作系统类型,或者是当操作系统的硬盘满了之后,需要清空文件等,可以使用when语句来做判断 。when关键字后面跟着的是python的表达式,在表达式中你能够使用任何的变量或者fact,当表达式的结果返回的是false,便会跳过本次的任务
示例:当系统版本是centos6和7时各使用不同的命令
- hosts: all remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: start nginx service6 shell: service ngixn start when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" - name: start nginx service shell: systemctl start ngixn.service when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
8)循环:迭代,需要重复执行的任务;在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;
元素:列表有两种方式; 字符串和字典
循环迭代:基于字符串列表给出元素示例:
[[email protected] ~]# vim websrvs.yaml - hosts: websrvs remote_user: root tasks: - name: install packages yum: name={{ item }} state=latest with_items: - httpd - php - php-mysql - php-mbstring - php-gd
循环迭代:基于字典列表给元素示例:
[[email protected] ~]# vim users.yaml - hosts: all remote_user: root tasks: - name: create groups group: name={{ item }} state=present with_items: - groupx1 - groupx2 - groupx3 - name: create users user: name={{ item.name }} group={{ item.group }} state=present with_items: - {name: ‘userx1‘, group: ‘groupx1‘} - {name: ‘userx2‘, group: ‘groupx2‘} - {name: ‘userx3‘, group: ‘groupx3‘}
9)roles:角色
当单个playbook文件越来越大的时候,我们就需要重新来组织Playbooks了。我们可以将一个大的playbook拆成若干个小的 playbook文件,然后通过include的方式,在主配置文件中将这些零碎的小文件包含进来,这叫做playbook的包含。我们也可以按照一定的 规则将执行的某一类型任务放在一个目录里,并在这个目录中再次对这个playbook按照 tasks,handlers,files,templates,vars等类型划分成若干文件,将对应文件存放在对应的目录中,这种组织方式就叫做 playbook的roles。
以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;
role_name/
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进行“包含”调用; default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
在playbook中调用角色的方法: - hosts: HOSTS remote_user: USERNAME roles: - ROLE1 - ROLE2 - { role: ROLE3, VARIABLE: VALUE, ...} - { role: ROLE4, when: CONDITION }
5.playboot示例
1)基础示例
[[email protected] ~]# vim group.yaml [[email protected] ~]# cat group.yaml - hosts: all remote_user: root tasks: - name: install a group group: name=mygrp system=true - name: install a user user: name=user1 group=mygrp system=true - hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd - name: start httpd service service: name=httpd state=started
正式使用时我们最好先预运行下看有没有错误
[[email protected] ~]# ansible-playbook --check group.yaml
没有问题就可以正式运行命令脚本了
[[email protected] ~]# ansible-playbook group.yaml
2)handlers:由特定条件触发的Tasks;
只有其关注的条件满足时,才会被触发执行的任务;
调用及定义方式:
tasks: - name: TASK_NAME module: arguments notify: HANDLER_NAME handlers: - name: HANDLER_NAME module: arguments
handlers示例:
- hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd state=latest - name: install conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: reload httpd service - name: start httpd service service: name=httpd state=started handlers: - name: reload httpd service shell: /usr/sbin/httpd reload 修改Listen 80为Linsten 8080: [[email protected] ~]# ansible-playbook --check web.yaml [[email protected] ~]# ansible-playbook web.yaml
3)tags:给指定的任务定义一个调用标识;
- name: NAME module: arguments tags: TAG_ID
tags示例:
- hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd state=latest - name: install conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: instconf notify: reload httpd service - name: start httpd service service: name=httpd state=started handlers: - name: reload httpd service shell: service httpd reload [[email protected] ~]# ansible-playbook --check -t instconf web.yaml [[email protected] ~]# ansible-playbook -t instconf web.yaml
注意:多个任务可以使用同一个tags,也可以一次任务指多个tags,执行命令时多个tags用,号隔开;如下图 [[email protected] ~]# ansible-playbook -t instconf,instpkg web.yaml
4)variables示例(1)
- hosts: websrvs remote_user: root vars: - pkgname: vsftpd tasks: - name: install a package yum: name={{ pkgname }} state=present [[email protected] ~]# ansible-playbook pkg.yaml 直接执行yaml脚本,安装的是剧本中定义的变量 [[email protected] ~]# ansible-playbook -e pkgname=memcached pkg.yaml 注意:命令行变量的优先于剧本中定义的值
4)variables示例(2):向不同的系统传递不同的变量
编辑剧本
- hosts: websrvs remote_user: root tasks: - name: install a package yum: name={{ pkgname }} state=present
编辑hosts文件,将变量赋值到hosts对应的主机后,实现不同主机安装不同的程序包
[websrvs] 192.168.25.139 pkgname=nginx 192.168.25.140 pkgname=httpd
4)variables示例(3):在hosts文件中向一个主机组赋值变量
[websrvs] 192.168.25.139 192.168.25.140 [websrvs:vars] pkgname=memcached [dbsrvs] 192.168.25.141
5)Templates:模板;示例1
第一步:ansible主机编辑配置文件作为要使用templates传递的文件;以nginx的配置文件中的cpu核心数为例
[[email protected] ~]# vim /root/nginx.conf.j2 #user nobody; worker_processes {{ ansible_processor_vcpus }};
第二步:编辑playbook调用templates模块
[[email protected] ~]# vim test.yaml - hosts: websrvs remote_user: root tasks: - name: genrrate conf file template: src=/root/nginx.conf.j2 dest=/tmp/nginx.conf
第三步:执行playbook命令
[[email protected] ~]# ansible-playbook test.yaml
第四步:在对应的被管控主机上查看配置文件中的变量是否是响应的值
[[email protected] ~]# less /tmp/nginx.conf #user nobody; worker_processes 1;
5)Templates:模板;示例2:定义一个名为nginx.yaml的模版剧本,完成安装nginx程序包,复制配置文件,启动服务,定义tags通知处理器完成服务重载
第一步:在ansible主机的/etc/ansible/hosts文件中定义一个nginx组
[nginx] 192.168.25.139 192.168.25.140
第二步:写一个nginx专用的yaml文件,注意:在安装程序包的时候依赖与远程主机的yum源,如果没有yum源的话,可以使用shell模块让远程主机先下载一个程序包,然后再执行后续的安装任务,在安装任务时指明yum: name=绝对路径来进行
- hosts: nginx remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: install conf file template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf tags: ngxconf notify: reload nginx service - name: start nginx service service: name=nginx state=started enabled=true handlers: - name: reload nginx service shell: /usr/sbin/nginx -s reload
第三步:提供一个.j2结尾的nginx配置文件,里边写上自己需要的配置
[[email protected] ~]# vim nginx.conf.j2
第四步:执行ansible-playbook命令,运行nginx.yaml
[[email protected] ~]# ansible-playbook --check nginx.yaml 注意:测试运行的时候因为远程主机没有安装程序包,所以在执行到第三个任务时会出错,没有影响,直接运行就可以了 [[email protected] ~]# ansible-playbook nginx.yaml
第五步:在远程主机查看是否生效
6)循环迭代:基于字符串列表给出元素示例:
[[email protected] ~]# vim websrvs.yaml - hosts: websrvs remote_user: root tasks: - name: install packages yum: name={{ item }} state=latest with_items: - httpd - php - php-mysql - php-mbstring - php-gd
7)循环迭代:基于字典列表给元素示例:
[[email protected] ~]# vim users.yaml - hosts: all remote_user: root tasks: - name: create groups group: name={{ item }} state=present with_items: - groupx1 - groupx2 - groupx3 - name: create users user: name={{ item.name }} group={{ item.group }} state=present with_items: - {name: ‘userx1‘, group: ‘groupx1‘} - {name: ‘userx2‘, group: ‘groupx2‘} - {name: ‘userx3‘, group: ‘groupx3‘}
8)roles示例nginx
cd到ansible角色目录 [[email protected] ~]# cd /etc/ansible/roles/ 创建角色和各角色下的目录 [[email protected] roles]# mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv 为nginx/files/目录下提供nginx的rpm包 lftp 10.1.0.1:/pub/Sources/6.x86_64/nginx> mget nginx-1.6.2-1.el6.ngx.x86_64.rpm 安装nginx程序 只为了拷贝配置文件 [[email protected] nginx]# yum install files/nginx-1.6.2-1.el6.ngx.x86_64.rpm 编辑nginx的tasks [[email protected] roles]# vim nginx/tasks/main.yml - name: copy nginx package to remote host copy: src=nginx-1.6.2-1.el6.ngx.x86_64.rpm dest=/tmp/nginx-1.6.2-1.el6.ngx.x86_64.rpm - name: install nginx package yum: name=/tmp/nginx-1.6.2-1.el6.ngx.x86_64.rpm state=present - name: install conf file nginx.conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf tags: ngxconf notify: reload nginx service - name: start nginx service service: name=nginx enabled=true state=started - name: install conf file default.conf template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf tags: ngxconf notify: reload nginx service 编辑nginx的handlers [[email protected] roles]# vim nginx/handlers/main.yml - name: reload nginx service service: name=nginx state=restarted 为nginx提供配置文件这里直接复制本机的配置文件做修改 [[email protected] roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2 [[email protected] roles]# vim nginx/templates/nginx.conf.j2 user nginx; worker_processes {{ ansible_processor_vcpus }};注意cpu可以减1 或者减2 如: {{ ansible_processes_vcpus - 1 }}; [[email protected] nginx]# cp /etc/nginx/conf.d/default.conf templates/default.conf.j2 [[email protected] nginx]# vim templates/default.conf.j2 server { listen {{ ngxport }}; server_name localhost; 编辑nginx的变量 [[email protected] nginx]# vim vars/main.yml ngxport: "8090" 这里定格写 编辑调用角色的配置文件: [[email protected] ansible]# vim /etc/ansible/nginx.yml - hosts: nginx remote_user: root roles: - nginx 编辑ansible的配置文件,启用roles寻找路径 [[email protected] ~]# vim /etc/ansible/ansible.cfg 36 roles_path = /etc/ansible/roles 测试运行 [[email protected] ansible]# ansible-playbook --check nginx.yml 没有问题就可以直接运行了 [[email protected] ansible]# ansible-playbook nginx.yml 执行成功以后就可以在其他主机上测试了 [[email protected] ~]# ss -tnl 8090端口处于监听状态 现在再次让nginx监听到8080端口; 编辑nginx.yml配置文件 [[email protected] ansible]# vim nginx.yml - hosts: nginx remote_user: root roles: - { role: nginx, ngxport: 8080 } 执行命令:指明标签跳过其他任务只执行ngxconf标签 [[email protected] ansible]# ansible-playbook -t ngxconf nginx.yml 在远程主机上查看监听端口,已经是8080了 ]# ss -tnl
8)relos示例memcached
[[email protected] ansible]# yum install memcached -y [[email protected] ansible]# vim roles/memcached/tasks/main.yml - name: install memcached yum: name=memcached state=latest - name: install conf file template: src=memcached.j2 dest=/etc/sysconfig/memcached tags: mcconf notify: reload memcached - name: start memcached service service: name=memcached state=started enabled=true [[email protected] ansible]# vim roles/memcached/handlers/main.yml - name: reload memcached service: name=memcached state=restarted [[email protected] ansible]# cp /etc/sysconfig/memcached roles/memcached/templates/memcached.j2 [[email protected] ansible]# vim roles/memcached/templates/memcached.j2 PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="{{ ansible_memtotal_mb // 4 }}" OPTIONS="" [[email protected] ansible]# vim nginx.yml - hosts: nginx remote_user: root roles: - nginx - memcached [[email protected] ansible]# ansible-playbook nginx.yml [[email protected] ~]# cat /etc/sysconfig/memcached 远程主机查看内存大小 PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="245" OPTIONS=""
8)relos示例mysqk
[[email protected] ansible]# vim roles/mysql/tasks/main.yml - name: install mysql-server yum: name=mysql-server state=latest when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" - name: install mariadb-server yum: name=mysql-server state=latest when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" - name: start mysql service service: name=mysqld state=started when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" - name: start mariadb service service: name=mariadb state=started when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" [[email protected] ansible]# vim db.yml - hosts: dbsrvs remote_user: root roles: - mysql [[email protected] ansible]# ansible-playbook db.yml
本文出自 “Astrotrain” 博客,请务必保留此出处http://astrotrain.blog.51cto.com/11343918/1879618
以上是关于ansible的主要内容,如果未能解决你的问题,请参考以下文章