目录

 

是什么?

工作原理?

部署?

常用模块?

playbook?

roles


是什么?

ansible是自动化运维工具,实现了批量系统配置、批量程序部署、批量运行命令等功能,从而提升运维的管理能力,解决工作中的管理难题。

工作原理?

运维自动化平台是由管理机器和业务机器组成的。管理机器:任务定制及发布;业务机器:接收任务并执行任务。

  • 用户登录管理机器:通过ansible剧本或单行命令针对业务机器组或者单个机器部署任务;
  • 管理机器读取用户的部署任务:根据自己hosts文件中定义的业务机器组查找对应的机器地址(ip或域名)
  • 管理机下发任务:管理机通过SSH免密连接业务机器,下发任务给业务机器;
  • 业务机器执行任务
  • 业务机器将执行结果发送给ansible管理机器

部署?

  • 服务器

主机名称

ip地址

test-1.wn.com(管理机器)

192.168.52.21

test-2.wn.com(业务机器)

192.168.52.22

test-3.wn.com(业务机器)

192.168.52.23

  • 主机名互相绑定

    cat /etc/hosts

ansible file获取传参数引用 ansible的copy_重启

  • 关闭防火墙

   systemctl stop firewalld

   systemctl disable firewalld

   reboot

   systemctl status firewalld

  • 时间同步
  • ssh免密(实现管理机器可以免密登录业务机器)

    ssh-keygen

    ssh-copy-id -i .ssh/id_rsa.pub root@192.168.52.22

    ssh root@192.168.52.22 #测试是否可以免密登录

    ssh-copy-id -i .ssh/id_rsa.pub root@192.168.52.23

    ssh root@192.168.52.23 #测试是否可以免密登录

  • 管理机器(192.168.52.21)安装ansible并测试

    wget https://releases.ansible.com/ansible/ansible-2.9.0rc3.tar.gz

    tar xf ansible-2.9.0rc3.tar.gz

    mv ansible-2.9.0rc3 /opt/ansible

    cd /opt/ansible/

    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/  #安装依赖

    pip install --user ansible -i https://pypi.tuna.tsinghua.edu.cn/simple/  #安装软件

    ln -s /opt/ansible/bin/* /usr/bin/

    mkdir /etc/ansible

    cp /opt/ansible/examples/ansible.cfg /etc/ansible/

    部署主机列表,定义被监控机:

    执行ansible的时候会去读取客户端文件hosts,如果没有把客户端加入到hosts文件中,就说明无法被ansible管理。此hosts不等同于/etc/hosts

    cp /opt/ansible/examples/hosts /etc/ansible/

    cat /etc/ansible/hosts

    [group1]

   192.168.52.[22:23]

   test-[2:3].wn.com

   备注:当然ssh端口不是22也可以设置,未做免密机器也可以设置。示例如下:

   192.168.98.202:12121 ansible_ssh_user=sko ansible_ssh_pass='123'

   web1 ansible_ssh_host=192.168.98.203 ansible_ssh_port=12121

    测试管理机和业务机器的联通性:

    ansible -m ping 192.168.52.22

    ansible -m ping group1

常用模块?

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

具体用法:ansible 机器 -m 模块名称 -a ‘模块参数’

官网模块文档地址:

https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html

查看所有的模块:ansible-doc -l

查看具体模块的用法:ansible-doc ping

    ##修改主机名

    示例:ansible -m hostname -a “name=test-2” 192.168.52.22

    注意:/etc/hosts中并不会改变,但是/etc/hostname会改变

    ##对文件或文件夹进行相关操作,创建、删除、权限、软硬链接、创建目录

    文件创建:ansible -m file group1 -a “path=/opt/test state=touch”

    文件删除:ansible -m file group1 -a “path=/opt/test state=absent”

    文件权限:ansible -m file group1 -a “path=/opt/test owner=wn group=nobody mode=0600”

    软链接:ansible -m file group1 -a “src=/opt/test path=/opt/test_1 state=link”

    硬链接:ansible -m file group1 -a “src=/opt/test path=/opt/test_2 state=hard”

    创建目录:ansible -m file group1 -a “path=/opt/test_dir state=directory”

    删除目录:ansible -m file group1 -a “path=/opt/test_dir state=absent”

    修改目录及子文件权限:ansible -m file group1 -a “path=/opt/test_dir owner=wn mode=2755 recurse=yes”

    ##copy模块用于对文件的远程拷贝操作(从管理机器到业务机器)

    touch /opt/test

    cat /opt/test

    abcdef

    sha1sum /opt/test

    ansible -m copy group1 -a “src=/opt/test dest=/opt owner=wn group=nobody mode=0400 checksum=f8182e9ccdbe6efd13eb36a056a7db203fe66e40”

    注意:拷贝时目录是否带”/”符号

    ansible -m copy group1 -a “content=’hello world’ dest=/opt/test” ##管理机往远程文件里写内容(会覆盖原内容)

    注意:content的引号不能丢掉

    force:如果目标文件已存在,则是否覆盖

    backup:如果拷贝的文件内容与原内容不一样,则会备份一份;如果拷贝过来的文件本机存在,group1的机器上会将/opt/test备份一份,备份文件命名加上时间,再远程拷贝新的文件为/opt/test

    ##将远程机器的文件拷贝到本地。

    注意:不管是拷贝多个机器还是一个机器的文件,在管理机本地目录都会按照IP/路径/文件名

    ansible -m fetch group1 -a “src=/opt/test dest=/opt”

    在业务机192.168.52.22执行:

    touch /opt/test_2

    vi /opt/test_2

    在管理机器上执行:

    ansible -m fetch 192.168.52.22 -a “src=/opt/test_2 dest=/opt”

    ##用于管理用户账号和用户属性

    创建用户:

    echo “12345” | openssl passwd -1 -stdin

    ansible -m user group1 -a “name=wn password=’fsferr’”

    用户删除:

    ansible -m user group1 -a “name=wn state=absent remove=yes”

    注意:

    在删除用户的时候报错:user wn is currently userd by process 5163

    那是因为我在业务机上执行了su wn,su root操作,你只需要在那台机器上执行ctrl+D操作就可以了。

    参考:

    ##用于管理用户组合用户组属性

    ansible -m group group1 -a “name=admin state=present” ##组创建

    ansible -m group group1 -a “name=admin state=absent” ##组删除

    ##用于管理周期性时间任务

    ansible -m cron group1 -a “name=’cron test’ user=root job=’echo haha > /opt/test’ minue=’*/1’”  ##执行

    ansible -m cron group1 -a “name=’cron test’ state=absent”  ##删除任务

  • yum模块

    ##用于使用yum命令来实现软件包的安装于卸载。

    ansible -m yum group1 -a “list=repos”  ##列出包信息

    ansible -m yum group1 -a “name=vsftpd”  ##安装一个软件

    ansible -m yum 192.168.52.22 -a “state=absent name=vsftpd”  ##删除软件包

    ##用于控制服务的启动、关闭、开机自启动等

    ansible -m service 192.168.52.22 -a “name=vsftpd state=started enabled=on” ##启动vsftpd服务,并设置为开机自启动

    ansible -m service 192.168.52.22 -a “name=vsftpd state=stopped enabled=false” ##关闭vsftpd服务,并设为开机不自动启动

    注意:在安装过程中报错unregistered authentication agent for unix-process:

    参考解决

    ##用于在远程机器上执行本地脚本

    在管理机上创建脚本,通过ansible将脚本分发到被管理端。

    注意:脚本一直存在于ansible管理机本地,不需要手动拷贝到远程主机后再执行。

    在管理机创建脚本:

    touch /opt/test.sh

    chmod u+x /opt/test.sh

    cat /opt/test.sh

#!/bin/bash
for ((i=1;i<10;i++))    
do
        for ((n=1;n<=i;n++))
        do
          echo -n  " $i*$n " >> /opt/test.log
        done
        echo " " >> /opt/test.log  
done

    ansible -m script group1 -a “/opt/ansible_test.sh”

    ansible -m command group1 -a “ls /opt” #测试执行是否成功

    ##用于执行linux命令。

    两个模块类似,区别在于command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以。

    ansible -m shell 192.168.52.22 -a “ls /root”

    ansible -m shell 192.168.52.22 -a “echo ‘hello world’ > /opt/testShell”

    ansible -m shell 192.168.52.22 -a “cat /opt/testShell”

    ansible -m command 192.168.52.22 -a “ls /root”

    ansible -m command 192.168.52.22 -a “echo ‘hello world’ > /opt/testShell”

    ansible -m command 192.168.52.22 -a “cat /opt/testShell”  注意:你会发现上一条命令没有起作用

  • setup模块

    ##用于收集远程主机的基本信息(如操作系统类型、主机名、ip、cpu信息,内存信息)

    ansible -m setup 192.168.52.22

    ansible -m setup 192.168.52.22 -a “filter=’ansible_processor’”  ##打印cpu信息

    ansible -m setup 192.168.52.22 -a “filter=’ansible_kernel’”  ##打印内核信息

    ansible -m setup 192.168.52.22 -a “filter=’ansible_hostname’” ##打印主机名

    ansible -m setup 192.168.52.22 -a “filter=’ansible_ens*’” ##打印网卡信息

    ##用于获取文件的状态信息

    ansible -m stat 192.168.52.22 -a “path=/opt/test” ## 获取/opt/test文件的状态信息

playbook

是ansible用于配置,部署和管理被控节点的剧本。ansible格式的脚本,将所有需要执行的操作按照ansible的编程语法,放到文件中执行。

YAML格式规则:

文件的第一行以”---“开始,表明yaml文件的开始;

以”#”开头为注释;

列表中的所有成员都开始于相同的缩进级别,并且使用”- “作为开头(一个横杠和一个空格);

一个字典是由一个简单的键: 值的形式组成(这个冒号后面必须是一个空格)。

参数说明:

hosts:用于指定要执行任务的主机,其可以是一个或多个由冒号分割主机组;

remote_user:用于指定远程主机上的执行任务的用户;

tasks:任务列表,按顺序执行任务(如果一个host执行task失败,整个tasks都会回滚);

handlers:类似task,但需要使用notify通知调用,实现按需调用(不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次;handlers最佳的应用场景是用来重启服务或触发系统重启操作);

variables:定义变量可以被多次方便调用;

with_items:迭代列表

示例(安装vsftpd,并启动该服务):

ansible file获取传参数引用 ansible的copy_ansible file获取传参数引用_02

注意:修改vsftpd.conf文件,再次运行,会发现触发了notify。

ansible-playbook /etc/ansible/vsftpd.yaml

roles

通过分别将variables,tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。主要使用场景代码复用度较高的情况下。更多了解可查看《Ansible--Ansible之Roles