ansible基本架构以下图所示html
主控端支持local,ssh,zeromq三种方式链接被控端,默认使用基于ssh的链接--------这部分对应基本架构架构图中的链接模块;node
能够按应用类型等法师进行Host Inventory(主机群)分类,管理节点经过各种模块实现相应的操做,---单个模块,单条命令称为ad-hocpython
管理节点统一经过playbooks实现多个task的集合实现一类功能,如web服务的安装部署,数据库服务端的批量备份等,palybooks咱们能够理解为剧本,经过组合多条ad-hoc操做的配置文件c++
ansible默认是经过ssh通道来管理的,也就是它所说的免客户端方式来管理,底层是经过paramiko来实现的git
ansible执行过程大致过程以下图,其中暖色的表明模块化github
名称 | IP | 操做系统 | 用途 |
---|---|---|---|
ansible-server | 192.168.11.17 | centos7 | 管理端 |
client-1 | 192.168.11.18 | centos7 | |
client-2 | 192.168.11.19 | centos7 |
须要先配置epel源,能帮助咱们解决软件包的依赖关系 yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm # epel源 并安装ansible ll /etc/yum.repos.d/epel* # 安装 yum install ansible -y
参考博客: https://blog.51cto.com/tengxiansheng/1863688web
源码安装须要首先确保安装了git
,由于它的源码是保存在GitHub,咱们须要利用git将其clone下来而后本地编译安装shell
安装git yum install -y git
数据库
安装ansiblecentos
git clone https://github.com/ansible/ansible.git -recursive cd ./ansible source ./hacking/env-setup
具体安装过程本身能够尝试哦,这里就不截图展现了。
验证安装是否安装OK能够参考上面的ansible --version
解决依赖
yum install python-pip python-devel gcc gcc-c++ glibc-devel zlib-devel openssl-devel -y
pip 安装ansible
pip install ansibele --upgrade 验证安装是否安装OK能够参考上面的ansible --version ansible --version 查看版本
两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下。
hosts:机器清单,进行分组管理
文件配置经常使用参数
使用化境变量方式来配置 大多数的Ansible参数能够经过设置带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母,以下配置: export ANSIBLE_SUDO_USER=root 设置了环境变量以后,ANSIBLE_SUDO_USER就能够在playbook中直接引用。 二、设置ansible.cfg配置参数 Ansible有不少配置参数,下面列出经常使用的配置参数: 1)inventory 该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible须要链接管理的主机列表 inventory = /root/ansible/hosts 2)library Ansible的操做动做,不管是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 library = /usr/share/ansible 3)forks 设置默认状况下Ansible最多能有多少个进程同时工做,默认设置最多5个进程并行处理。具体须要设置多少个,能够根据控制主机的性能和被管理节点的数量来肯定。 forks = 5 4)sudo_user 这是设置默认执行命令的用户,也能够在playbook中从新设置这个参数 sudo_user = root 5)remote_port 这是指定链接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,否则这个参数通常是不须要修改的 remote_port = 22 6)host_key_checking 这是设置是否检查SSH主机的密钥。能够设置为True或False host_key_checking = False 7)timeout 这是设置SSH链接的超时间隔,单位是秒。 timeout = 20 8)log_path Ansible系统默认是不记录日志的,若是想把Ansible系统的输出记录到人i治稳健中,须要设置log_path来指定一个存储Ansible日志的文件 log_path = /var/log/ansible.log 另外须要注意,执行Ansible的用户须要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现的日志中的 9)host_key_checking 若是有台被管节点从新安装系统并在known_hosts中有了与以前不一样的密钥信息,就会提示一个密钥不匹配的错误信息,直到被纠正为止,在使用Ansible时,若是有台被管理节点没有在known_hosts中被初始化,将会在使用Ansible或定时执行Ansible时提示对key信息的确认。 若是你不想出现这种状况,而且你明白禁用此项行为的含义,只要修改该参数为False便可 host_key_checking = False
lnventory 分组
常见参数配置
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版本
详细参数:https://www.cnblogs.com/LuisYang/p/5960660.html
格式
[test] # 组名 10.0.0.1 # 主机ip 或者10.0.0.1:65522 自定义端口
简单配置
[defaults] inventory = /etc/ansible/hosts sudo_user=root remote_port=22 host_key_checking=False remote_user=root log_path=/var/log/ansible.log module_name=command private_key_file=/root/.ssh/id_rsa no_log:True
参数
实例:
ansible tests1 -m copy -a 'src=/tmp/test.txt dest=/tmp/test/test.txt"
ansible <host-pattern> [-f forks] [-m module_name] [-a args] [options]
做为ansible的默认模块,能够容许远程主机范围内的全部shell命令。
注意: 在command的命令中含有像$ HOME'这样的变量和像``<“',
”>“, `“”“”,“”;“”和“”&“'将没法正常工做(若是须要这些功能,请使用[shell]模块)
ansible 192.168.168.11* -m command -a 'ip addr show dev eth0' 参数: – chdir:在运行命令以前,切换到此目录。
功能:执行远程主机的shell脚本文件
ansible all -m shell -a "/home/test.sh" 参数: – chdir:在运行命令以前,切换到此目录。 – executable:更改用于执行命令的shell(bash,sh)。 应该是可执行文件的绝对路径。
功能: 实现主控端向目标主机copy文件。
ansible all -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755" #src 主控端文件位置 #dest 被控端目标位置 #owner 文件复制过去后的全部者 #group 文件复制过去后的所属组 #mode 文件的权限设定,执行a+x这种方式
用途:用于从被控端 中拷贝文件到主控端
注意: 不能拷贝目录
ansible pythonserver -m fetch -a "src=/root/123 dest=/root" SSH password: - fetch: src: 在远程拉取的文件,而且必须是一个file,不能是目录 dest: 用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile
功能:安装 软件包
ansible all -m yum -a "name=httpd state=latest disable_gpg_check=yes enablerepo=epel" #name 包名 #state (Choices: present, installed, latest, absent, removed)[Default: present] #disable_gpg_check:禁止gpg检查 #enablerepo:只启动指定的repo
功能: 被控端的crontab配置,用于管理计划任务的
参考博客: https://blog.51cto.com/noodle/1769528
ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom" backup:对远程主机上的原任务计划内容修改以前作备份 cron_file:若是指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划 minute分,hour时,day日,month月,weekday周 job: 要执行的任务,依赖于state=present name: 该任务的描述 special_time: 指定何时执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly state: 确认该任务计划是建立仍是删除 user: 以哪一个用户身份执行
功能: 服务管理,
[root@localhost ~]# ansible all -m service -a "name=httpd state=restarted" #启动服务 [root@localhost ~]# ansible all -m service -a "name=httpd state=running" #查看服务状态 [root@localhost ~]# ansible all -m service -a "name=httpd state=stoped" #中止服务 参数: enabled=:是否开机自动启动,取值为true或false; name=:服务名字; state=:状态,取值有started,stoped,restarted。
基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式做为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)
- template: src: /mytemplates/foo.j2 dest: /etc/file.conf owner: bin group: wheel mode: 0644 – backup: 若是原目标文件存在,则先备份目标文件 – src:在ansible控制器上的Jinja2格式化模板的路径。 这能够是相对或绝对的路径。 – dest:将模板渲染到远程机器上的位置。 force:是否强制覆盖,默认为yes – owner:目标文件属主 – group:目标文件属组 – mode:目标文件的权限模式,模式能够被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)
功能:用于远程主机上的文件操做,对文件的全部权,组合模式进行更改
# 更改文件全部权,组和模式。 当使用八进制数指定模式时,第一个数字应始终为0。 - file: path: /etc/foo.conf owner: foo group: foo mode: 0644 # touch建立文件,使用符号模式设置权限(至关于0644) - file: path: /etc/foo.conf state: touch mode: "u=rw,g=r,o=r" # touch建立文件,添加/删除一些权限 - file: path: /etc/foo.conf state: touch mode: "u+rw,g-wx,o-rwx" # 建立一个目录,若是它不存在 - file: path: /etc/some_directory state: directory mode: 0755 – force:须要在两种状况下强制建立软连接,一种是源文件不存在但以后会创建的状况下;另外一种是目标软连接已存在,须要先取消以前的软链,而后建立新的软链,有两个选项:yes|no – group:定义文件/目录的属组 – mode:定义文件/目录的权限 – owner:定义文件/目录的属主 – path:必选项,定义文件/目录的路径 – recurse:递归的设置文件的属性,只对目录有效 – src:要被连接的源文件的路径,只应用于state=link的状况 – dest:被连接到的路径,只应用于state=link的状况 – state: directory:若是目录不存在,建立目录 file:即便文件不存在,也不会被建立 link:建立软连接 hard:建立硬连接 touch:若是文件不存在,则会建立一个新的文件,若是文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消连接文件
功能: 远程主机用户管理
[root@localhost ~]# ansible all -m user -a "name=jerry comment=' doubi jerry'" #添加用户 详细参数参考ansible-doc user [root@localhost ~]# ansible all -m user -a "name=jerry state=absent remove=yes" #删除用户
功能: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机若是在线,则回复pong
还用个hping 模块,
ansible erp -m ping
执行原始的命令,而不是经过模块子系统。在任何状况下,使用shell或命令模块是合适的。给定原始的参数直接经过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变动处理程序支持。
这个模块不须要远程系统上的Python,就像脚本模块同样。此模块也支持Windows目标。
用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements
# 安装bottle python包。 - pip: name: bottle # 在0.11版安装bottle python包。 - pip: name: bottle version: 0.11 # 使用远程协议(bzr +,hg +,git +,svn +)安装MyApp。 您没必要在extra_args中提供'-e'选项。 - pip: name: svn+http://myrepo/svn/MyApp#egg=MyApp # 使用远程协议(bzr +,hg +,git +)安装MyApp。 - pip: name: git+http://myrepo/app/MyApp # 从本地压缩包安装MyApp - pip: name: file:///path/to/MyApp.tar.gz # 将bottle安装到指定的virtualenv中,继承全局安装的模块 - pip: name: bottle virtualenv: /my_app/venv virtualenv_site_packages: yes # 使用Python 2.7将bottle安装到指定的virtualenv中 - pip: name: bottle virtualenv: /my_app/venv virtualenv_command: virtualenv-2.7 # 在用户主目录中安装bottle。 - pip: name: bottle extra_args: --user # 安装指定的python requirements - pip: requirements: /my_app/requirements.txt # 在指定的virtualenv中安装指定的python requirements。 - pip: requirements: /my_app/requirements.txt virtualenv: /my_app/venv # 安装指定的python requirements和自定义pip源URL - pip: requirements: /my_app/requirements.txt extra_args: -i https://example.com/pypi/simple # 专门为Python 3.3安装bottle,使用'pip-3.3'可执行文件。 - pip: name: bottle executable: pip-3.3 # 安装 bottle,若是已安装,强制从新安装 - pip: name: bottle state: forcereinstall
参数
– chdir: 执行pip命令前cd进入的目录 – name:要安装的Python库的名称或远程包的URL。 – requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,若是使用chdir选项,则能够将文件指定为相对路径。 – version:指定的Python库的安装版本。 – extra_args:额外的参数传递给pip。 – executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,若是系统中安装了Python 2.7和3.3,而且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一块儿指定(在2.1中添加)。 默认状况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。 – virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一块儿指定(在2.1中添加)。 若是virtualenv不存在,则将在安装软件包以前建立它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的建立。 – virtualenv_command:用于建立虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。 – virtualenv_python:用于建立虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不该使用此参数。 – state:状态(present,absent,latest, forcereinstall),表示是安装还卸载 present:默认的,表示为安装 lastest: 安装为最新的版本 absent:表示删除 forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。
功能: 分组
ansible web -m group -a 'name=g1 gid=666 state=present system=yes' – gid:指定用的gid。 – name:指定用户名。 – state:是建立仍是删除。(present,absent) – system:若是是,则表示建立的组是系统组。
模块主要用于从http、ftp、https服务器上下载文件(相似于wget),主要有以下选项:
- name: Download foo.conf get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf mode: 0440 - name: Download file with custom HTTP headers get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf headers: 'key:value,key:value' - name: Download file with check (sha256) get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c – sha256sum:下载完成后进行sha256 check; – timeout:下载超时时间,默认10s – url:下载的URL – url_password、url_username:主要用于须要用户名密码进行验证的状况 – dest:将文件下载到哪里的绝对路径。若是dest是目录,则使用服务器提供的文件名,或者若是没有提供,将使用远程服务器上的URL的基本名称。 – headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。
功能: 用于解压文件
- name: 将foo.tgz解压缩到/var/lib/foo中 unarchive: src: foo.tgz dest: /var/lib/foo - name: 解压远程计算机上已存在的文件 unarchive: src: /tmp/foo.zip dest: /usr/local/bin remote_src: yes - name: 解压文档须要下载的文件(2.0中添加) unarchive: src: https://example.com/example.zip dest: /usr/local/bin remote_src: yes 参数: – copy:在解压文件以前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。 – creates:指定一个文件名,当该文件存在时,则解压指令不执行 – dest:远程主机上的一个路径,即文件解压的绝对路径。 – group:解压后的目录或文件的属组 – list_files:若是为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项 – mode:解压后文件的权限 – src:若是copy为yes,则须要指定压缩文件的源路径 – owner:解压后文件或目录的属主 ---------------------
功能: script模块将本地脚本复制到远程主机并运行之
ansible web -m script -a 'time.sh'
相似saltstack的grains静态信息收集,收集一些主机硬件信息或者以及其余如fqdn等等
使用setup获取ip地址以及主机名使用filter过滤等等
获取内存信息 ansible db -m setup -a 'filter=ansible_memory_mb' 获取主机名 ansible db -m setup -a 'filter=ansible_nodename'