ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
安装
Ubuntu
# 安装 add-apt-repository 必要套件
apt-get install -y python-software-properties software-properties-common
# 使用 Ansible 官方的 PPA 套件来源
add-apt-repository -y ppa:ansible/ansible
apt-get update
# 安装 Ansible
apt-get install -y ansible
CentOS
yum install -y epel-release
yum install -y ansible
相关文件
文件/目录
/etc/ansible/ansible.cfg # 主配文件
/etc/ansible/hosts # 被控端主机列表
/etc/ansible/roles/ # 存放角色目录
程序
/usr/bin/ansible # 主程序
/usr/bin/ansible-doc # 查看配置文档,查看模块帮助
/usr/bin/ansible-galaxy # 上传下载优秀代码或roles的官方平台
/usr/bin/ansible-playbook # 制定自动化任务
/usr/bin/ansible-pull # 远程执行命令工具
/usr/bin/ansible-vault # 文件加密工具
/usr/bin/ansible-console # 基于 console 界面与用户交互工具
ansible 基于 ssh 协议,先要做好主控端和被控端的 ssh 的 key 验证:
ssh-keygen # 生成 ssh 公钥私钥
ssh-copy-id 192.168.0.30 # 复制公钥到被控端
ssh-copy-id 192.168.0.40
命令格式:
ansible <host-pattern> -m [模块] 选项 参数
-m [模块] # 指定模块,默认为 command
--list # 显示主机列表
-v # 显示过程信息,-vv -vvv 更详细的信息
-C # 检查,并不执行
-T # 超时时间,默认10s
-u # 远程执行的用户
ansible 的 host-pattern 写法:
ansible "web:&db" -m ping # 逻辑与:在web组并且再db组的主机。
ansible 'web:!db' -m ping # 逻辑非:在web组但不在db组的主机,这里必须用单引号。
ansible 'web:db' -m ping # 逻辑或:在web组或者在db组的主机。
/etc/ansible/hosts
写法:
[db]
db-1 ansible_host=192.168.200.50
db-2 ansible_host=192.168.200.51
db-3 ansible_host=192.168.200.52
db-4 ansible_host=192.168.200.32
[app]
app-1 ansible_host=192.168.200.33
app-2 ansible_host=192.168.200.34
模块
ping 模块
检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong。
ansible db -m ping
192.168.0.40 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.0.30 | SUCCESS => { "changed": false, "ping": "pong" }
shell 模块
shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 程序处理。
# 执行 ls 命令:
ansible db -m shell -a "ls"
# 进入 /data 目录后执行 ls -l 命令:
ansible db -m shell -a "chdir=/data ls -l"
# 如果 /data/aaa 不存在,则执行 touch /data/aaa:
ansible db -m shell -a "creates=/data/aaa touch /data/aaa"
# 如果 /data/aaa 不存在,则不执行 ls -l:
ansible db -m shell -a "removes=/data/aaa ls -l"
script 模块
script 模块可以帮助我们在远程主机上执行 ansible 管理机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。
ansible db -m script -a "/root/test.sh"
192.168.0.30 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.0.30 closed.rn",
"stdout": "/bin/bashrnmysql-masterrn",
"stdout_lines": [
"/bin/bash",
"mysql-master"
]
}
192.168.0.40 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.0.40 closed.rn",
"stdout": "/bin/bashrnmysql-slavern",
"stdout_lines": [
"/bin/bash",
"mysql-slave"
]
}
copy 模块
copy 模块是将 ansible 管理机上的文件复制到远程主机中。
# 将管理机的 /root/copytest.txt 文件复制到远程主机的 /data 目录下:
ansible db -m copy -a "src=/root/copytest.txt dest=/data/"
# 如果远程主机存相同文件,则不复制,如果 force=yes 远程内容不同则覆盖:
ansible db -m copy -a "src=/root/copytest.txt dest=/data/ force=no"
# 如果远程存在相同文件,则创建备份:
ansible db -m copy -a "src=/root/copytest.txt dest=/data/ backup=yes"
# 复制文件到远程并且设定文件属主(owner)、属组(group)、权限(mode):
ansible db -m copy -a "src=/root/copytest.txt dest=/data/ owner=mysql group=mysql mode=0644"
file 模块
file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
# 在远程主机创建 /data/aaa 文件,如果已经存在则修改时间戳,作用与touch命令相似:
ansible db -m file -a "path=/data/aaa state=touch"
# 在远程主机创建 /data/testdir 目录,如果已存在则不操作:
ansible db -m file -a "path=/data/testdir state=directory"
# 在远程主机为 aaa 文件创建软连接 aaa-link,如果已存在则不操作,如果软连接与其他文件重名可用 force=yes 强制覆盖:
ansible db -m file -a "path=/data/aaa-link state=link src=/data/aaa"
# 在远程主机为 aaa 文件创建硬连接 aaa-hard,如果已存在则不操作:
ansible db -m file -a "path=/data/aaa-hard state=hard src=/data/aaa"
# 在远程主机删除 /data/testdir:
ansible db -m file -a "path=/data/testdir state=absent"
# 在远程主机创建目录/文件时指定属性、权限,或直接修改权限属性:
ansible db -m file -a "path=/data/testdir state=directory owner=mysql group=mysql mode=0644"
ansible db -m file -a "path=/data/copytest.txt owner=www group=www mode=0644"
# 在操作远程主机目录属性,同时递归子目录文件设置属性、权限:
ansible db -m file -a "path=/data/testdir state=directory owner=mysql group=mysql recurse=yes"
fetch 模块
功能是从远程主机取回文件。
# 从远程主机取回文件
ansible app -m fetch -a "src=/tmp/{{ inventory_hostname }}.tar.bz2 dest=/backup/ flat=yes"
# {{ inventory_hostname }} 代表远程主机名
# src 远程主机文件路径
# dest 本地目录路径
# flat=yes 表示不按远程路径存储,flat=no 反之
blockinfile 模块
blockinfile 模块可以在指定的文件中插入“一段文本”,这段文本是被标记过的。
在远程主机/data/copytest.txt
文件中插入一段111n222
:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="111n222"'
cat /data/copytest.txt
# BEGIN ANSIBLE MANAGED BLOCK
111
222
# END ANSIBLE MANAGED BLOCK
使用marker参数自定义文本块标记:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="111n222" marker="; {mark} ansible add"'
cat /data/copytest.txt
# BEGIN ANSIBLE MANAGED BLOCK
111
222
# END ANSIBLE MANAGED BLOCK
; BEGIN ansible add
111
222
; END ansible add
执行完上例基础上,执行以下命令,因为; {mark} ansible add
已经在文本中存在,所以执行更新操作:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="333" marker="; {mark} ansible add"'
cat /data/copytest.txt
# BEGIN ANSIBLE MANAGED BLOCK
111
222
# END ANSIBLE MANAGED BLOCK
; BEGIN ansible add
333
; END ansible add
删除标记文本块两种方法:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="" marker=";{mark} ansible add"'
ansible db -m blockinfile -a 'path=/data/copytest.txt state=absent' # 不加marker参数则删除默认标记
# 在文件开头插入:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="start start" marker="# {mark} test" insertbefore=BOF'
# 在文件末尾插入:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="end end" marker="# {mark} test end" insertafter=EOF'
# 正则匹配bbb开头行之后插入:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="BBBBBB" marker="# {mark} test reg" insertafter="^bbb.*"'
# 操作之前执行备份操作:
ansible db -m blockinfile -a 'path=/data/copytest.txt marker="# {mark} test reg" state=absent backup=yes'
# 如果文件不存在,则创建后操作:
ansible db -m blockinfile -a 'path=/data/copytest.txt block="test" marker="# {mark} test" create=yes'
暂无评论内容