ansbile是一款简单的自动化运维工具
ansible是由主机清单(配置),playbook(配置),以及各模块插件组成;简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对清单中的主机进行统一管理。
# 首先要安装epel源
yum install epel-release -y
yum install ansible -y
ansible的主配置文件
###### /etc/ansible/ansible.cfg
这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改;###### /etc/ansible/hosts
这个配置文件就是默认主机清单配置文件,可通过ansible.cfg重新定义的
ansible
HOST-PATTERN #匹配主机模式,如all表示所有主机
-m MOD_NAME #模块名 如:ping
-a MOD_ARGS #模块执行的参数
-f FORKS #生成几个子进行程执行
-C #(不执行,模拟跑)
-u Username #某主机的用户名
-c CONNection #连接方式(default smart)
完整示例:
[root@ansible ~]# ansible all -m shell -a "ifconfig|grep enp0s3"
172.16.3.152 | SUCCESS | rc=0 >>
enp0s3: flags=4163 mtu 1500
172.16.3.216 | SUCCESS | rc=0 >>
enp0s3: flags=4163 mtu 1500
ansible模块比较多,可以通过ansible-doc --help 显示帮助信息
ansible doc -l 获取所有当前版本下的可用模块及简要信息
ansible-doc -s 模块名 获取指定模块帮助信息说明``
从本地copy文件分发到目录主机路径
参数说明:
src= 源文件路径
dest= 目标路径
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
content= 自行填充的文件内容
owner 属主
group 属组
mode 权限
从远程主机拉取文件到本地
说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径
在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析;
这就是因为command模块不是shell解析属于裸执行导致的,为了能达成以上类似shell中的解析,ansible有一个shell模块;
由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,
shell模块可以做到
设置文件属性(创建文件)
常用参数:
path目标路径
state directory为目录,link为软件链接
group 目录属组
owner 属主
等,其他参数通过ansible-doc -s file 获取
创建软链接
通过cron模块对目标主机生成计划任务
常用参数:
除了分(minute)时(hour)日(day)月(month)周(week)外
name: 本次计划任务的名称
state: present 生成(默认) |absent 删除 (基于name)
ansible all -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible all -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root
ansible all -m cron -a 'backup="True" name="test" minute="0" hour="5,2" job="ls -alh > /dev/null"'
ansilbe all -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'
故名思义就是yum安装软件包的模块;
常用参数说明:
enablerepo,disablerepo表示启用与禁用某repo库
name 安装包名
state (present’ orinstalled’, latest’)表示安装, (absent’ or `removed’) 表示删除
服务管理模块
常用参数:
name:服务名
state:服务状态
enabled: 是否开机启动 true|false
runlevel: 启动级别 (systemed方式忽略)
把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;
playbook是Ansible的配置,部署和编排的语言。他们可以描述你所希望的远程系统强制执行的政策,或者在一般的IT流程的一组步骤;形象点的说就是:如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象.
hosts : playbook配置文件作用的主机
tasks: 任务列表 variables: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles:用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等
ansible-playbook --check # 只检测可能会发生的改变,但不真执行操作
ansible-playbook --list-hosts # 列出运行任务的主机
ansible-playbook --syntax-check playbook.yaml #语法检测
ansible-playbook -t TAGS_NAME playbook.yaml # 只执行TAGS_NAME任务
ansible-playbook playbook.yaml # 运行
第一步:在家目录下创建playbooks
[root@ansible ~]# mkidr playbooks
[root@ansible ~]# cd playbooks
[root@ansible playbooks]# cat redis_first.yaml
- hosts: all remote_user: root tasks:
- name: install redis
yum: name=redis state=latest
- name: start redis
service: name=redis state=started
第二步:语法检测
[root@ansible playbooks]# ansible-playbook --syntax-check redis_first.yaml
playbook: redis_first.yaml
将要执行的主机:
[root@ansible playbooks]# ansible-playbook --list-hosts redis_first.yaml
playbook: redis_first.yaml
play #1 (all): all TAGS: []
pattern: [u'all']
hosts (2):
192.168.0.88
192.168.0.99
第三步:执行
[root@ansible playbooks]# ansible-playbook redis_first.yaml
PLAY [all] *****************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [install redis] *******************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
TASK [start redis] *********************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
PLAY RECAP *****************************************************************************************************************
192.168.0.88 : ok=3 changed=2 unreachable=0 failed=0
192.168.0.99 : ok=3 changed=2 unreachable=0 failed=0
# 说明:自上而下列出了三个任务,分别是[Gathering Facts] , [install redis], [start redis],其中各主机上成功为ok=3,有两项任务执行结果是changed
# 不可达 和失败的任务均为0;
# 由于上面的操作是直接安装redis服务并启动,并没有配置文件,这还不能往生产环境中使用,生产环境中的redis肯定有不同的配置项,因此需要在安装时提供配置文件
第一步:复制一个redis.conf到本地并进行修改
[root@ansible ~]# ansible 192.168.0.88 -m fetch -a "src=/etc/redis.conf dest=./"
[root@ansible ~]# mv /root/192.168.0.88/etc/redis.conf /root/playbooks/redis.conf
第二步:创建 .yaml 文件
[root@ansible playbooks]# vim redis_second.yaml
[root@ansible playbooks]# cat redis_second.yaml
- hosts: all #所有远程主机
remote_user: root #以远程主机上root用户执行
tasks: #任务
- name: install redis #任务之安装
yum: name=redis state=latest #动作调用yum模块安装
- name: copy config file #任务之复制同步配置文件到远程目标主机
copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis #动作copy模块执行
notify: restart redis #触发的动作
tags: configfile #任务标记名configfile
- name: start redis #任务之启动redis
service: name=redis state=started #动作调用sevice模块
handlers: #特定情况下,接收到其他任务的通知时被触发
- name: restart redis
service: name=redis state=restarted
第三步:再次测试并执行
[root@ansible playbooks]# ansible-playbook redis_second.yaml
PLAY [all] ****************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [install redis] ******************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [copy config file] ***************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
TASK [start redis] ********************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
RUNNING HANDLER [restart redis] *******************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
PLAY RECAP ****************************************************************************************************************
192.168.0.88 : ok=5 changed=2 unreachable=0 failed=0
192.168.0.99 : ok=5 changed=2 unreachable=0 failed=0
可以发现只是加了一个配置文件,所有的任务都执行了,我们可以只执行新添加的任务。
这里就要通过 ansible-playbook -t TAGS_NAME 来执行了
[root@ansible playbooks]# ansible-playbook -t configfile redis_second.yaml
PLAY [all] ****************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [copy config file] ***************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
RUNNING HANDLER [restart redis] *******************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
PLAY RECAP ****************************************************************************************************************
192.168.0.88 : ok=3 changed=2 unreachable=0 failed=0
192.168.0.99 : ok=3 changed=2 unreachable=0 failed=0
以上执行结果就只有更新和重启。
ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客户端程序,但需要目标主机有ssh和python2.4+。
基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥。
ansible-playbook 基于YAML语法配置,可以对playbook文件进行测试,解析并执行应用于指定无端主机,非常方便我们统一编排分发管理远程主机。