ansible简介:一款自动化软件,基于python开发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能。
优点:只需要SSH和PYthon即可使用;无需要客户端;门槛低;使用公司较多;基于PYthon开发。
依赖关系:ansible默认通过ssh协议管理服务,被管理主机要开启ssh服务,允许absible主机登陆,托管节点需安装PYthon2.5以上的版本等。
ansible配置文件寻找顺序:(默认路径:/etc/ansible/ansible,cfg)
1.先寻找ANSIBLE_CONFIG变量定义的配置文件
2.其次检查当前目录下的./ansible.cfg文件
3.其次检查当前用户家目录下的 ~/ansible.cfg文件
4.最后检查/etc/ansible/ansible.cfg文件
ansibel.cfg配置文件
inventory定义托管主机地址配置文件路径名
inventory指定的配置文件,写入远程主机的地址。
ansible需要给所有主机部署秘钥
ssh-keygen 创建秘钥 ssh-copy-id 所有主机名称
部署文件组 : vim /etc/ansible/hosts
[web] web1 web2 [db] db1 db2 [other] cache
常见命令 ansible 主机集合 -m 模块名称 -a 模块参数 (-i 文件路径脚本 -k 交互密码)
ansible all –list //可以查看主机列表
ansible all -m ping //ping所有主机 ( -k 交互式,没秘钥验证可加上使用)
模块使用:
ansible-doc :模块手册,相当于shell和man,
– ansbile-doc -l 列出所有模块
– ansible-doc modulename 查看帮助
ping模块: 检查ssh的连通性, ansible 主机 -m ping
command模块:默认模块,可远程执行命令
用法:ansible 主机 -m command -a [ 命令 ]
例如:ansible all -m command -a “uptime”
注意:命令需要可直接执行,如果有 <> | & 则执行不成功,不能解析系统变量
shell模块:基本上与command一样,区别是shell通过/bin/sh执行,可执行任意命令,不能执行交互式命令,例如VIM,TOP等。
用法:ansibele all -m shell -a ‘uptime’
ansible web -m shell -a ‘echo ${HOSTNAME}’
scipt模块:在本地编写脚本,然后使用script模块批量执行
vim /etc/a.sh
ansible web -m script -a ‘/root/a.sh’
yum模块:使用yum来管理管理软件包
-name:软件包名字 -state:动作(installed,removed)
ansible db -m yum -a ‘name=”mariadb-server ” state=installed ‘ 安装
ansible cache -m yum -a ‘name=”lrzsz” state=removed’
service模块:可启动服务
-name:服务名称 -enabled:时候开机启动 yes|no -state:服务启动,停止
ansible cache -m service -a ‘name=”sshd” enabled=”yes” state=”started”‘
copy模块: 主要用于分发配置文件,复制管理主机的文件。
复制文件:ansible all -m copy -a ‘src=/etc/resolv.conf dest=/etc/resolv.conf’
复制目录:andible all -m copy -a ‘src=/etc/yum.repo.d/ dest=/etc/yum.repos.d/’
lineinfile模块 : 类似于sed一种行编辑替换模块,匹配行,修改整行。
-path 目标文件 -regrexp 正则表达式 -line 最终修改结果
例如:ansible db -m lineinfile -a ‘path=”/etc/my.cnf” regexp=”^binlog-format” line=”binlog-format=row”‘
replace模块:类似于sed一种行编辑替换模块,匹配行,修改某字段。
-path 目标文件 -regrexp 正则表达式 -replace 替换后的结果
例如:ansible db -m replace -a ‘path=”/etc/my.cnf” regexp=”row” replace=”mixed”‘ (绿色表示执行成功,黄色表示文件发生改变)
template模块:类似于copy模块,但是能使用变量。
playbook:用于ansible配置,部署,管理托管主机,执行一系列的tasks,可以让远端主机大道预期状态。(剧本)
由一个或者多个play组成,由hosts,variables,roles,tasks,等对象组成。
hosts: 定义要执行playbook的远程主机。
vars:定义playbook运行时需要使用的变量。
tasks:定义将要在远程主机上执行任务列表。
handlers:定义task执行完成以后需要调用的任务。
playbook的ping脚本检测
[root@ansible ansible]# vim ping.yml
—
– hosts: all
remote_user: root
tasks:
– ping:
[root@ansible ansible]# ansible-playbook ping.yml
用playbook安装Apache,修改端口,配置ServerName,修改主页,设置开机自启
[root@ansible ansible]#vim httpd.yml
—
– hosts: cache
remote_user: root
tasks:
– name: 安装apache
yum:
name: httpd
state: installed
– lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: ‘^Listen’
line: ‘Listen 8080’
– service:
name: httpd
enabled: yes
state: restarted
-copy:
src: /root/index.html
dest: /var/www/html/index.html
变量:
使用 yaml 传递参数
ansible-playbook user.yml -e @args.yaml
[root@ecs-proxy my-ansible]# cat args.yaml
—
username: w5
[root@ecs-proxy my-ansible]# vim user.yaml
—
– name: 添加用户
hosts: web
tasks:
– name: 添加用户”{{username}}”
user:
name: “{{username}}”
group: root
password: “{{‘123456’ | password_hash(‘sha512’)}}”
~
给指定的任务定义一个调用标识tages,使用handers来配置文件,重新载入让服务生效
通过增加 tags来定义标签,通过增加motify定义调整的名字,通过命令- t motify的参数来执行需要执行的服务。以下则调整更换首页地址,命令为:ansible-playbook web.yml -t update_inde
[root@ansible ~]# vim web.yml
[root@ansible ~]# vim index.html
—
– name: reload web_httpd_conf
hosts: web
tasks:
– name: 更新配置文件
tags: update_httpd
motify: reload_httpd
copy:
src: httpd.conf
dest: /etc/httpd/conf/httpd.conf
owner: root
group: root
mode: ‘0644’
– name: 更换首页地址
tags: update_index
motify: reload_conf
copy:
src: index.html
dest: /var/www/html/index.html
owner: apache
group: apache
mode: ‘0644’
handlers:
– name: reload_conf
service:
[root@ansible ~]# ansible-playbook web.yml -t update_index
with_item创建多用户
通过增加with_item来创建多用户
—
– hosts: web1
remote_user: root
tasks:
– name: 添加用户
user: group=wheel password={{‘123456’ | password_hash(‘sha512’)}} name={{item}}
with_items: [“ya”,”bc”,”plj”,”lx”]
创建多用户
—
– hosts: web2
remote_user: root
tasks:
– name: 添加用户
user: group={{item.group}} password={{‘123456’ | password_hash(‘sha512’)}} name={{item.name}}
with_items:
– {name: ‘yan011’ , group: ‘root’}
– {name: ‘yan012’ , group: ‘root’}
– {name: ‘yan013’ , group: ‘wheel’}