ansible基础

作者: clickdiff | 来源:发表于2017-09-19 14:58 被阅读164次

    简介

    ansible是一个简单的it自动化工具,可以实现批量进行系统配置,软件部署和运行命令等功能。基于python语言实现,由于paramiko和PyYaml两个模块构成。

    Ansible与Saltstack最大的区别是Ansible无需在被控主机部署任何客户端代理,默认直接通过SSH通道进行远程命令执行或下发配置

    ansible架构图

    模块 功能
    connection plugins 远程连接插件
    hosts 定义管理主机或主机组
    modules 包含各个核心模块及自定义模块
    Plugin 完成模块功能的补充,如日志插件、邮件插件等
    Playbook ansible的任务配置文件,将多个任务定义在剧本中进行管理

    安装ansible

    默认ansible在epel源中

    yum install ansible -y
    
    [root@localhost ~]# ansible --version  #查看ansible版本
    ansible 2.2.1.0
    config file = /etc/ansible/ansible.cfg
    configured module search path = Default w/o overrides
    

    生成文件

    可以查看生成的文件

    rpm -ql ansible 
    

    由于文件太多可以只看前20行的

    程序文件

    /etc/ansible #ansible主程序

    /usr/bin/ansible-doc #ansible文档查看器

    /usr/bin/ansible-galaxy #你可以把他理解成ansible的pip,可以从galaxy.ansible.com下载官方收录的playbooks

    /usr/bin/ansible-playbook#playbook就是 用这个跑的

    /usr/bin/ansible-pull #支持直接从git下载playbook执行,需要遵循其规定的目录格式。

    /usr/bin/ansible-vault # 如果你的配置文件中含有敏感信息,你可能并不希望他能被人看到,vault可以帮你加密/解密这个配置文件

    配置文件

    /etc/ansible/ansible.cfg #ansible主配置文件

    /etc/ansible/hosts # ansible主机列表

    ansible配置文件加载顺序:

    Ansible配置文件是以ini格式存储配置数据的,在Ansible中,几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照预先设定的顺序查找配置文件,如下所示:

    1. ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件。
    2. /ansible.cfg:接着ansible会检查当前目录下的./ansible.cfg文件
    3. ~/.ansible.cfg:接着检查当前用户home目录下的.ansible.cfg文件
    4. /etc/ansible/ansible.cfg:最后会检查/etc/ansible/ansible.cfg
      注意:如果你通过发行版的提供的软件包管理工具(yum之类的)或者pip安装的ansible,那么在你的/etc/ansible目录下已经有了ansible.cfg配置文件,如果你是通过GitHub仓库安装的,在你复制的仓库中examples目录下可以找到ansible.cfg,你可以把它拷贝到/etc/ansible目录下。

    配置选项

    可以使用环境变量的方式来进行配置:
    大多数的ansible参数都可以通过使用带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母。比如:

     export ANSIBLE_SUDO_USER=root 
    

    设置了环境变量之后,ANSIBLE_SUDO_USER就可以在playbook中直接引用。

    ansible.cfg配置参数

    inventory

    这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。这个参数的配置实例如下:

    inventory = /etc/ansible/hosts
    

    library

    Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:

    library = /usr/share/ansible
    

    Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。

    forks

    设置默认情况下Ansible最多能有多少个进程同时工作,从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是50或100。默认值5是非常保守的值,配置实例如下:

    forks = 5
    

    sudo_user

    这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。配置实例如下:

    sudo_user = root
    

    remote_port

    这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。配置实例如下:

    remote_port = 22
    

    host_key_checking

    这是设置是否检查SSH主机的密钥。可以设置为True或False,配置实例如下:

    host_key_checking = False
    

    timeout

    这是设置SSH连接的超时间隔,单位是秒。配置实例如下:

    timeout = 60
    

    log_path

    Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。配置实例如下:

    log_path = /var/log/ansible.log
    

    另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现在日志中的。

    ansible命令参数

    ansible <host-pattern> [options]

    -m MODULE_NAME, --module-name=MODULE_NAME     要执行的模块,默认为 command  
    -a MODULE_ARGS, --args=MODULE_ARGS      模块的参数  
    -u REMOTE_USER, --user=REMOTE_USER ssh      连接的用户名,默认用 root,ansible.cfg 中可以配置
    -k, --ask-pass      提示输入 ssh 登录密码,当使用密码验证登录的时候用     
    -s, --sudo      sudo 运行
    -U SUDO_USER, --sudo-user=SUDO_USER     sudo 到哪个用户,默认为 root
    -K, --ask-sudo-pass     提示输入 sudo 密码,当不是 NOPASSWD 模式时使用
    -B SECONDS, --background=SECONDS       run asynchronously, failing after X seconds(default=N/A)
    -P POLL_INTERVAL, --poll=POLL_INTERVAL      set the poll interval if using
    -B (default=15)
    -C, --check     只是测试一下会改变什么内容,不会真正去执行
    -c CONNECTION   连接类型(default=smart)
    -f FORKS, --forks=FORKS     fork 多少个进程并发处理,默认 5
    -i INVENTORY, --inventory-file=INVENTORY      指定hosts文件路径默认 default =/etc/ansible/hosts
    -l SUBSET, --limit=SUBSET       指定一个 pattern,对<host_pattern>已经匹配的主机中再过滤一次
    --list-hosts        只打印有哪些主机会执行这个 playbook 文件:不是实际执行该 playbook
    -M MODULE_PATH, --module-path=MODULE_PATH       要执行的模块的路径,默认为/usr/share/ansible/
    -o, --one-line      压缩输出,摘要输出
    --private-key=PRIVATE_KEY_FILE      私钥路径
    -T TIMEOUT, --timeout=TIMEOUT   ssh 连接超时时间,默认 10 秒
    -t TREE, --tree=TREE            日志输出到该目录,日志文件名会以主机名命名
    -v, --verbose   verbose mode (-vvv for more, -vvvv to enable connection debugging)
    

    配置登录

    ansible使用ssh登录,所以要在两者之间配置秘钥登录,这样才能开始正常的工作

    免密登录

    ssh-keygen -t rsa -P ""#生成秘钥/root/.ssh/id_rsa.pub
    
    ssh-copy-id -i ./.ssh/id_rsa.pub root@172.16.254.105 #将公钥传到172.16.254.105上
    

    实现了master与其他节点之间的连接

    定义ansible节点

    [testgroup]  #服务器组名,统一管理用
    172.16.254.103 # 节点地址
    

    执行who查看信息

    [root@localhost ~]# ansible testgroup -m command -a 'who' #组
    172.16.254.103 | SUCCESS | rc=0 >>
    root :0 2017-09-10 13:40 (:0)
    root pts/0 2017-09-10 13:41 (:0)
    root pts/1 2017-09-19 10:58 (gateway)
    root pts/2 2017-09-19 14:48 (172.16.254.105)

    [root@localhost ~]# ansible all -m command -a 'who'  #所有
    172.16.254.103 | SUCCESS | rc=0 >>
    root     :0           2017-09-10 13:40 (:0)
    root     pts/0        2017-09-10 13:41 (:0)
    root     pts/1        2017-09-19 10:58 (gateway)
    root     pts/2        2017-09-19 14:49 (172.16.254.105)
    
    [root@localhost ~]# ansible 172.168.x.x -m command -a 'who' #单个ip的
    

    为更好的规范定义的主机与组变量,我们实际是不会在hosts里直接写的,将定义的主机名与组变量单独剥离出来放到指定的文件中,将采用YAML格式存放,存放位置规定:"/etc/ansible/group_vars/名"和"/etc/ansible/host_vars/主机名"分别存放指定组名或主机名定义的变量,如/etc/ansible/group_vars/mysql.yml

    相关文章

      网友评论

        本文标题:ansible基础

        本文链接:https://www.haomeiwen.com/subject/ewqwsxtx.html