自动化运维工具ansible详解

自动化运维工具ansible详解

  • ansible简介
    • ansible是什么
    • ansible的特点
  • ansible工作流程
  • ansible配置
  • ansible常用模块
    • command模块
    • cron模块
    • user模块
    • group模块
    • copy模块
    • file模块
    • ping模块
    • yum模块
    • service模块
    • shell模块
    • script模块
    • setup模块
  • ansible组件——inventory变量参数

ansible简介

ansible是什么

ansible是一个开源的IT自动化配置部署,管理的工具。
ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身并没有批量部署的能力,真正具有批量部署的是ansible所运行的模块。

ansible的特点

  • 部署简单,只需要在主控端部署ansible环境
  • 默认使用的是SSH协议对主机进行管理
  • 大量的运维操作模块,可以实现日常维护的大部分操作
  • 配置简单,功能强大,扩展性强
  • 支持API以及自定义模块,可以通过python轻松扩展
  • 可以通过playbook来定制强大的配置和管理
  • 轻量级,无需在客户端安装agent
  • 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

ansible工作流程

1)加载自己的配置文件,默认/etc/ansible/ansible.cfg
2)查找对应主机配置文件,找到要执行的主机或组
3)加载ansible命令中对应的应用模块文件
4)通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
5)对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
6)给文件 +x 执行权限;
7)执行并返回结果;
8)删除临时py文件,sleep 0退出;

ansible配置

[root@ansible ~]# yum -y install epel-release --nogpgcheck    ##安装epel源
[root@ansible ~]# yum -y install ansible
[root@ansible ~]# ansible --version   ## 查看ansible的版本信息
ansible 2.9.16
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

vi /etc/ansible/hosts     ## 在主机清单中添加主机节点地址
[apache]
192.168.10.20
[mysql]
192.168.10.30

ssh-keygen -t rsa 
ssh-copy-id 192.168.10.20
ssh-copy-id 192.168.10.30   ## 配置密钥对认证
ssh-agent bash ## 配置免交互代理
ssh-add

ansible常用模块

ansible的命令格式
命令格式:ansible [主机] [-m 模块] [-a args]
ansible-doc -l //列出所有已安装的模块 注:按q退出
ansible-doc -s [模块] //-s列出模块描述信息和操作动作

command模块

command模块可以帮助我们在远程主机上执行命令

[root@ansible ~]# ansible apache -m command -a 'pwd'  //指定主机或者ip执行date
192.168.10.20 | CHANGED | rc=0 >>
/root
[root@ansible ~]# ansible all -a 'pwd'  //如果不加-m模块,则默认运行command模块  all表示所有hosts主机执行命令
192.168.10.20 | CHANGED | rc=0 >>
/root
192.168.10.30 | CHANGED | rc=0 >>
/root

cron模块

管理远程主机中的计划任务
常用参数参数:

  • name:指定任务名称,可以根据任务名称修改或删除对应的任务;搭配state使用
  • state:absent表示删除对应的任务
  • minute:指定分钟,minute=1|1,2,3|/1|;默认是
  • hour:指定小时
  • day:指定日
  • month:指定月
  • weekday:指定周几
  • special_time:reboot|yearly|monthly|weekly|daily|hourly,都未指定时表示每分钟执行
  • user:指定计划任务属于哪个用户,默认管理员用户
  • disabled:注释计划任务,使其失效;但是一定要写全原任务name,minute,hour,month,weekday,job,如果不一样,则是修改原计划任务内容
  • backup:backup=yes表示修改或删除对应计划任务时,会先进行备份,备份路径/tmp/crontab+随机字符
    两种状态(state):present表示添加(可以省略),absent表示移除
[root@ansible ~]# ansible apache -m cron -a 'minute="*/1" job="/usr/bin/echo this is test cron >> /opt/test.txt" name="test cron"' //利用ansible制定一个任务计划,每隔一分钟在/opt/test.txt的文件中写入this is test cron
[root@ansible ~]# ansible apache -a 'crontab -l'  // 查看apache这个主机上的任务计划
192.168.10.20 | CHANGED | rc=0 >>
#Ansible: test cron
*/1 * * * * /usr/bin/echo this is test cron >> /opt/test.txt

[root@apache opt]# cat test.txt //在apache这个节点上也能看到写入的内容
this is test cron
this is test cron
this is test cron
this is test cron

[root@ansible ~]# ansible apache -m cron -a 'name="test cron" state=absent' //移除指定name的任务计划,假如该计划任务没有取名字,name=None即可

user模块

user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。

[root@ansible ~]# ansible apache -m user -a 'name="lisi"'  //在apache节点上创建lisi这个用户
[root@ansible ~]# ansible apache -a 'tail /etc/passwd'   //查看apache上是否创建了lisi用户
...
...
lisi:x:1001:1001::/home/lisi:/bin/bash     

[root@ansible ~]# ansible apache -m user -a 'name="lisi" state=absent' //删除lisi这个用户

group模块

group 模块可以帮助我们管理远程主机上的组

[root@ansible ~]# ansible apache -m group -a 'name="apache" gid=333 system=yes' //创建apache这个组
[root@ansible ~]# ansible apache -a 'tail /etc/group' //查看apache节点上是否生成apache这个组
...
...
apache:x:333:

[root@ansible ~]# ansible apache -m user -a 'name="lisi" uid=222 system=yes group=apache' //利用user模块将lisi用户添加进apache这个组里
[root@ansible ~]# ansible apache -a 'tail /etc/passwd' //查看是否生成的用户lisi
lisi:x:222:333::/home/lisi:/bin/bash 
[root@ansible ~]# ansible apache -a 'id lisi'   //查看lisi用户的信息
192.168.10.20 | CHANGED | rc=0 >>
uid=222(lisi) gid=333(apache)=333(apache)

copy模块

copy 模块的作用就是拷贝文件
常用参数:

  • src: ansible 端源文件或目录,空文件夹不复制
  • content: 用来替代src 用于将指定的文件内容复制到远程文件
  • dest : 客户端目标目录或文件,需要绝对路径
  • back_up: 复制之前备份远程节点上的原始文件
  • directory_code: 用于复制文件夹,新建文件会被复制,旧文件不会被复制
  • follow : 支持link文件复制
  • force : 覆盖远程主机不一致的内容
  • group : 设定远程主机文件夹的组名
  • mode : 文件夹权限
  • owner : 设定远程主机文件夹的用户名
[root@ansible ~]# ansible apache -m copy -a 'src=/opt/1.txt dest=/opt/1.txt.bak owner=root mode=755' //在ansible主机opt目录下创建1.txt,用ansible_copy模块拷贝到apache节点上
[root@ansible ~]# ansible apache -a 'cat /opt/1.txt.bak'   // 验证效果
192.168.10.20 | CHANGED | rc=0 >>
hello world

[root@ansible ~]# ansible apache -m copy -a 'content="hello world" dest=/opt/2.txt' //将hello world写入到指定的目录中
[root@ansible ~]# ansible apache -a 'cat /opt/2.txt'
192.168.10.20 | CHANGED | rc=0 >>
hello world

file模块

file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。

[root@ansible ~]# ansible apache -m user -a 'name=apache system=yes' //创建一个apache用户
[root@ansible ~]# ansible apache -m group -a 'name=apache system=yes' //创建一个apache的组
[root@ansible ~]# ansible apache -m file -a 'owner=apache group=apache mode=644 path=/opt/2.txt'  //设置文件的属主属组权限等
[root@ansible ~]# ansible apache -m file -a 'path=/opt/1.txt src=/opt/2.txt state=link' //设置/opt/1.txt为/opt/2.txt的链接文件
[root@ansible ~]# ansible apache -m file -a 'path=/opt/1.txt.bak state=absent' //删除apache节点上的一个文件
[root@ansible ~]# ansible apache -m file -a 'path=/opt/1.txt state=touch'  //在apache节点上创建一个文件
[root@ansible ~]# ansible apache -m file -a 'path=/opt/temp state=directory mode=755' //在apache节点上创建一个目录

ping模块

测试主机之间的连通性

[root@ansible ~]# ansible all -m ping 
192.168.10.20 | SUCCESS => {
     
    "ansible_facts": {
     
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.10.30 | SUCCESS => {
     
    "ansible_facts": {
     
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

yum模块

yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。
常用参数

  • name参数:必须参数,用于指定需要管理的软件包,比如 nginx。

  • state参数:用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。

  • disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。

  • enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。

  • disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。

  • enablerepo 参数和 disablerepo 参数可以同时使用。

[root@ansible ~]# ansible apache -m yum -a 'name=httpd'  //yum安装apache
[root@ansible ~]# ansible apache -m yum -a 'name=httpd state=absent' //yum卸载apache

service模块

[root@ansible ~]# ansible apache -a 'systemctl status httpd' //查看apache节点上apache的运行状态
[root@ansible ~]# ansible apache -m service -a 'name=httpd enabled=true state=started' //启动apache服务,并设置开机自启


shell模块

chdir:指定工作目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中
creates:指定一个文件,当指定的文件存在时,就不执行对应的命令
removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令

[root@ansible ~]# ansible apache -m shell -a 'chdir=/opt/temp echo this is test1 > 1.txt' //在apache节点上/opt/temp目录下创建一个内容是this is test1的文件
[root@ansible ~]# ansible apache -m shell -a 'chdir=/opt/temp cat 1.txt'
192.168.10.20 | CHANGED | rc=0 >>
this is test1

script模块

script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。

vi 1.sh  //在ansible管理端创建脚本
#!/bin/bash
echo "this is test script" > /opt/script.txt

chmod +x test.sh
ansible mysql -m script -a '1.sh'

[root@ansible ~]# ansible apache -a 'cat /opt/script.txt'
192.168.10.20 | CHANGED | rc=0 >>
this is test script

setup模块

setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。

[root@ansible ~]# ansible apache -m setup //获取mysql组主机的facts信息
[root@ansible ~]# ansible apache -m setup -a 'filter=ansible_all_ipv4_addresses' //用filter参数进行筛选,获取apache节点的ipv4地址
192.168.10.20 | SUCCESS => {
     
    "ansible_facts": {
     
        "ansible_all_ipv4_addresses": [
            "192.168.122.1", 
            "192.168.10.20"
        ], 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

ansible组件——inventory变量参数

ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般主机名使用FQDN(FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。)

inventory变量参数

参数 说明

  • ansible_ssh_host 将要连接的远程主机名,与你想要设定的主机的别名不同的话,可以通过此变量设置
  • ansible_ssh_port ssh端口号,如果不是默认的端口号,通过此变量设置
  • ansible_ssh_user 默认的ssh用户名
  • ansible_ssh_pass ssh密码(这种方式并不安全,我们强烈建议使用–ask-pass或SSH密钥)
  • ansible_ssh_private_key_file ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
  • ansible_ssh_common_args 此设置附加到sftp,scp和ssh的缺省命令行
  • ansible_sftp_extra_args 此设置附加到默认sftp命令行
  • ansible_scp_extra_args 此设置附加到默认scp命令行
  • ansible_ssh_extra_args 此设置附加到默认ssh命令行
  • ansible_ssh_pipelining 确定是否使用SSH管道。这可以覆盖ansible.cfg中的设置
  • ansible_shell_type 目标系统的ssh类型,默认情况下,命令的执行使用’sh’语法,可设置为’csh’或’fish’
  • ansible_python_interpreter 目标主机的python路径,适用于的情况:系统中有多个python。或者命令路径不是/usr/bin/python
  • ansible__interpreter 这里的可以是ruby或perl或者其他语言的解释器,作用和- ansible_python_interpreter类似
  • ansible_shell_executable 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh

你可能感兴趣的:(运维)