自动化运维工具 Ansible 基本操作和模块

2018-09-28 141次浏览 发表评论

ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

安装

Ubuntu

apt-get install -y python-software-properties software-properties-common   # 安装 add-apt-repository 必要套件
add-apt-repository -y ppa:ansible/ansible                                  # 使用 Ansible 官方的 PPA 套件来源
apt-get update
apt-get install -y ansible                                                 # 安装 Ansible

CentOS

yum install -y epel-release
yum install -y ansible

确认安装

ansible --version

相关文件

文件/目录

/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组的主机。

模块

ping 模块

检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong。

[root@localhost ~]# 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 管理主机本地,不需要手动拷贝到远程主机后再执行。

[root@localhost ~]# 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.\r\n", 
    "stdout": "/bin/bash\r\nmysql-master\r\n", 
    "stdout_lines": [
        "/bin/bash", 
        "mysql-master"
    ]
}
192.168.0.40 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.0.40 closed.\r\n", 
    "stdout": "/bin/bash\r\nmysql-slave\r\n", 
    "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"

blockinfile模块

blockinfile 模块可以在指定的文件中插入“一段文本”,这段文本是被标记过的。

在远程主机/data/copytest.txt文件中插入一段111\n222

ansible db -m blockinfile -a 'path=/data/copytest.txt block="111\n222"'
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="111\n222" 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'

评论

随便说点,聊聊天~