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\r\n"
  • 可以使用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)

  



 
 


转载于:https://www.cnblogs.com/linuxws/p/10746274.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值