zoukankan      html  css  js  c++  java
  • ansible

    安装ansible: 

    AnbleVersion2.4及更高版本可以管理包含Python2.6或更高版本的早期操作系统。

    yum方式安装:

    yum源或rpm包来源:埃佩尔以及Relases.ansible.com.

    $ sudo yum install ansible

    您也可以自己构建一个可以分发和安装的RPM。

    $ git clone https://github.com/ansible/ansible.git
    $ cd ./ansible
    $ make rpm
    $ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm
    

    托管节点的需求

    在托管节点上,需要ssh。默认情况下使用sftp。如果sftp不可用,可以在ansible.cfg切换到scp。您还需要Python 2(版本2.6或更高版本)或Python 3(版本3.5或更高版本)。

    • 如果在远程节点上启用了SELinux,需要安装 libselinux-python。 yum install libselinux-python

    • 默认情况下,Ansible使用位于/usr/bin/python的解释器。如果是 python2/3 您可能会看到以下错误:

      "module_stdout": "/bin/sh: /usr/bin/python: No such file or directory
      "
    • 可以使用raw 快速执行命令
      $ ansible myhost --sudo -m raw -a "yum install -y python2"

    通过Pip发布最新版本

    Ansible可以通过Python包管理器“pip”安装。如果您的Python版本中还没有“pip”,您可以通过以下方法获得pip:

    $ sudo easy_install pip
    

    然后用[1]:

    $ sudo pip install ansible
    

    或者如果您正在寻找最新的开发版本:

    $ pip install git+https://github.com/ansible/ansible.git@devel

     https://docs.ansible.com/ansible/latest/user_guide/index.html

    远程连接信息

    在我们开始之前,了解Ansible如何通过SSH与远程计算机进行通信是很重要的。

    EnterpriseLinux 6操作系统作为控制机器时,OpenSSH的版本可能太老,无法支持ControlPersio。就会使用“paramiko”。如果您希望使用KerberizedSSH等特性,请考虑使用Fedora、MacOS或Ubuntu作为您的控制机器,直到OpenSSH的更新版本在您的平台上可用为止。

    偶尔会遇到不支持SFTP的设备。这是很少见的,但是如果发生这种情况,您可以切换到scp模式。配置可测性.

    在使用远程机器时,Ansible默认假定您使用的是SSH键。鼓励使用SSH密钥,但在需要时也可以通过提供该选项来使用密码身份验证。--ask-pass。如果使用sudo特性和sudo需要密码时,也可以提供--ask-become-pass(以前--ask-sudo-pass已经被否决了)。

    1. 编辑/etc/ansible/hosts
    2. 添加本机的public SSH key到目标机器的authorized_keys   #ssh-copy-id
    3. 添加本机的私钥到Ansible
    4. 运行ansible all -m ping 测试是否添加成功

    /etc/ansible/hosts存放需要管理的机器。这是一个库存文件,在这里也有更深入的解释:处理库存.

    建立密钥认证
    [root@ansible ~]# ssh-keygen
    [root@ansible ~]# for i in {1..4}; do ssh-copy-id -i 192.168.78.1$i; done 
    
    设置SSH代理以避免重新键入密码:
    [root@ansible ~]#ssh-agent bash
    [root@ansible ~]#ssh-add ~/.ssh/id_rsa

    (取决于您的设置,您可能希望使用Ansible的--private-key选项来指定pem文件)

    [root@localhost ansible]# ansible --help | grep priva
        --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
     

    在所有节点上运行一个实时命令:

    $ ansible all -a "/bin/echo hello"
    

    阅读一些更真实的案例adhoc命令简介,探索使用不同模块可以做什么,并了解Ansible使用剧本语言。

    小贴士

    在运行命令时,可以使用“localhost”或“127.0.0.1”作为服务器名称来指定本地服务器。
    例子:
    $ ansible localhost -m ping -e 'ansible_python_interpreter="/usr/bin/env python"'
    通过将此添加到库存文件中,可以显式地指定localhost:
    localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python"  #创建了一个别名
    别名
        s1 ansible_ssh_port=65522 ansible_ssh_host=10.0.0.1 ansible_ssh_user=simon    # 别名s1

    配置:

    常用参数配置:
        ansible_ssh_host                    # 目标主机地址
        ansible_ssh_port                    # 目标主机端口,默认22
        ansible_ssh_user                    # 目标主机用户
        ansible_ssh_pass                    # 目标主机ssh密码
        ansible_sudo_pass                 # sudo密码
        ansible_sudo_exe                    
        ansible_connection               # 与主机的连接类型,比如:local,ssh或者paramiko
        ansible_ssh_private_key_file  # 私钥地址
        ansible_shell_type                 # 目标系统的shell类型
        ansible_python_interpreter   # python版本
    
    
    • 1)批量定义主机

    [g1]
           g[1:50].example.com
           g[a-f].example.com
    

      

    [root@localhost ansible]# vim /etc/ansible/hosts
    192.168.1.[128:130]
    
    [root@localhost ansible]# ansible all -uroot -k -m ping -o   #-k ssh密码登录  -u指定用户   -m要执行的模块  -o摘要输出
    SSH password: 
    192.168.1.128 | SUCCESS => {"changed": false, "ping": "pong"}
    192.168.1.129 | SUCCESS => {"changed": false, "ping": "pong"}
    192.168.1.130 | UNREACHABLE!: Failed to connect to the host via ssh: ssh: connect to host 192.168.1.130 port 22: No route to host
    • 2)内置参数:用户名和密码和ssh端口;命令行不用输入-u和-k选项

    [root@localhost ~]# vim /etc/ansible/hosts
    [web]
    192.168.1.[31:32] ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22'
    192.168.1.172 http_port=80
    
    [root@localhost ~]# ansible web  -m ping -o
    SSH password: 
    192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
    192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"}
    192.168.1.172 | SUCCESS => {"changed": false, "ping": "pong"}
      #可以让两台服务器产生的apache配置文件httpd.conf差异化
    • 3)组变量,:vars

    [webservers]
    192.168.1.[31:32]
    [web:vars]
    ansible_ssh_user='root'
    ansible_ssh_pass='redhat'
    ansible_ssh_port='22'
    http_port=80
      # 组变量的作用域是覆盖组所有成员,通过定义一个新块,块名由组名+ ":vars"组成。**

    •  4)全局变量、指定python解释器
    [all:vars]       # *:vars 块变量,all:vars 全局变量
    ansible_ssh_private_key_file=/root/.ssh/id_rsa
    ansible_ssh_port=22
    ansible_ssh_user=root
     
    [t3:vars]            # t3 使用python解释器是python2
    ansible_python_interpreter=/usr/bin/python2
    nginx_port=80        # 私有变量在playbooks中使用
     
    [t3]
    192.168.11.162    
    

     

    • 5)嵌套组,:children

    [root@localhost ~]# vim /etc/ansible/hosts 
    [nginx]
    192.168.1.31
    [apache]
    192.168.1.32
    [web:children]
    apache
    nginx
    [nested:vars]
    ntp_server=s1b.time.edu.cn 
    
    [root@localhost ~]# ansible webservers -m ping -o 
    192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"} 
    192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
      #嵌套组定义一个新块,块名由[ 组名+":chilren"] 组成。嵌套组也可以定义组变量,作用域是嵌套组里的所有组  
    嵌套组只能在/usr/bin/ansible-playbook中起作用,在/usr/bin/ansible中不起作用
    • 6)自定义主机清单文件

    [root@localhost ~]# ansible -i /etc/ansible/webservices webservers -m ping -o
    192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"}
    192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
    • 7)查看组中的主机列表

    [root@localhost ~]# ansible web --list-host
      hosts (2):
        192.168.1.32
        192.168.1.31
    
    [root@localhost ~]# ansible nginx  --list-host
      hosts (1):
        192.168.1.31  
    • 8)分离 主机与组 特定数据  

    将定义的主机名与组变量单独剥离出来放到指定的文件中,将采用YAML格式存放,存放位置规定:"/etc/ansible/group_vars/+组名"和"/etc/ansible/host_vars/+主机名"分别存放指定组名或主机名定义的变量,如下:

    [root@ansible host_vars]# cat 192.168.78.11.yml
    http_port: 80
    
    [root@ansible group_vars]# cat mysql.yml
    ntp_server: s1b.time.edu.cn
    database_server: 192.168.78.14
    
    [root@ansible group_vars]# cat web.yml
    ntp_server: s1b.time.edu.cn
    http_prot: 80

    **可以直接调用变量,规范目录名的原因是ansible会自动加载这几个目录下的变量,如果变量不放到这几个目录下,是不能调用的,我们会在后面介绍到不放到特定目录下,playbook如何调用这些变量**

     Inventory 分文件管理(文件名即是组名)
    
      分文件:
              /etc/ansible/group_vars/vim
              /etc/ansible/group_vars/webservers
              /etc/ansible/host_vars/foosball
              vim 文件中的内容: 变量
                  ntp_server: acme.example.org
                  db_server: 10.0.0.1
     
      分文件夹:(文件夹就是组名)
              /etc/ansible/group_vars/vim/install
              /etc/ansible/group_vars/vim/init
              /etc/ansible/host_vars/foosball
    

      

     
    [root@localhost ~]# ansible webservers -uroot -k -m ping -o
    SSH password: 
    192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
    192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"}
     

    三、常用模块

    copy模块:
        目的:把主控端/root目录下的a.sh文件拷贝到到指定节点上  
        命令:ansible 10.1.1.113 -m copy -a 'src=/root/a.sh dest=/tmp/ owner=root group=root mode=0755'
    file模块:
        目的:更改指定节点上/tmp/t.sh的权限为755,属主和属组为root  
        命令:ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root"
    cron模块:
        目的:在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间  
        命令:ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.254.139"'
    group模块:
    
         目的:在所有节点上创建一个组名为nolinux,gid为2014的组  
        命令:ansible all -m group -a 'gid=2014 name=nolinux'
    user模块:
        目的:在指定节点上创建一个用户名为nolinux,组为nolinux的用户  
        命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=present'  
        删除用户  
        命令:ansible 10.1.1.113 -m user -a 'name=nolinux state=absent remove=yes'
    yum模块:
        目的:在指定节点上安装 apache 服务  
        命令:ansible all -m yum -a "state=present name=httpd"
        state=latest=>>安装最新版本
    service模块:
        目的:启动指定节点上的 httpd 服务,并让其开机自启动  
        命令:ansible 10.1.1.113 -m service -a 'name=httpd state=restarted enabled=yes'
    script模块:
        目的:在指定节点上执行/root/a.sh脚本(该脚本是在ansible主控端)  
        命令:ansible 10.1.1.113 -m script -a '/root/a.sh'
    ping模块:
        目的:检查指定节点机器是否还能连通  
        命令:ansible 10.1.1.113 -m ping
    command模块:
         目的:在指定节点上运行hostname命令
        命令:ansible 10.1.1.113 -m command -a 'hostname'
    raw模块:
        目的:在10.1.1.113节点上运行ifconfig命令
        命令:ansible 10.1.1.113 -m raw-a 'ifconfig|eth0'
    get_url模块:
    
            目的:将http://10.1.1.116/favicon.ico文件下载到指定节点的/tmp目录下
        命令:ansible 10.1.1.113 -m get_url -a 'url=http://10.1.1.116/favicon.ico dest=/tmp'
    stat模块:
        目的:获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等信息
        ansible web -m stat -a 'path=/etc/sysctl.conf'
    synchronize模块:
        目的:将主控方/root/a目录推送到指定节点的/tmp目录下
        命令:ansible 10.1.1.113 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'
        执行效果:
        delete=yes   使两边的内容一样(即以推送方为主)
        compress=yes  开启压缩,默认为开启
        --exclude=.git  忽略同步.git结尾的文件
        mode=pull   更改推送模式为拉取模式
        目的:将10.1.1.113节点的/tmp/a目录拉取到主控节点的/root目录下
        命令:ansible 10.1.1.113 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'
    需要更多模块请使用ansible-doc -l查询
    

    关于ansbile工具的shell、command、script、raw模块的区别和使用场景

    command模块 [执行远程命令]
    [root@node1 ansible]# ansible testservers -m command -a 'uname -n'
     
    script模块 [在远程主机执行主控端的shell/python脚本 ]  (使用相对路径)
    [root@node1 ansible]# ansible testservers -m script -a '/etc/ansible/test.sh
     
    shell模块 [执行远程主机的shell/python脚本]
    [root@node1 ansible]# ansible testservers -m shell -a 'bash /root/test.sh'
     
    raw模块 [类似于command模块、支持管道传递]
    [root@node1 ansible]# ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print $2}' |awk -F: '{print $2}'"

    二、命令参数

     
     
    $ ansible all -m ping #ping所有节点 默认用当前用户名远程连接到计算机,-u 可以指定用户
    1)以bruce身份 ping 所有主机  
        ansible all -m ping -u bruce  
    2)用 bruce 用户以 root 身份 ping      
        ansible all -m ping -u bruce --sudo  
    3)用 bruce 用户 sudo 到 bruce 用户 ping      
        ansible all -m ping -u bruce --sudo --sudo-user bruce
    
        Usage: ansible <host-pattern> [options]  
        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)
    

      



     
     


  • 相关阅读:
    全卷积网络(FCN)与图像分割
    Mac下编译tesseract报错 DotProductAVX can't be used on Android
    OSTU二值化算法
    ssh的用户配置文件config管理ssh会话
    SSD: Single Shot MultiBox Detector 编译方法总结
    论文笔记——A Deep Neural Network Compression Pipeline: Pruning, Quantization, Huffman Encoding
    LeetCode——Word Break
    C#多线程编程
    impinj 编程接口
    C# 委托实例(跨窗体操作控件)
  • 原文地址:https://www.cnblogs.com/linuxws/p/10746274.html
Copyright © 2011-2022 走看看