{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2020-06-09 15:50:51","updateBy":"admin","updateTime":"2020-06-09 15:50:51","remark":null,"id":28,"articleTitle":"Ansible（一）介绍","articleUrl":"ansible_introduction","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/5969ef61cf754d1aa6e0f5c28219aefa.jpg","articleFlag":"1","draftStatus":"1","reprintStatement":"0","articleSummary":"Ansible是一种批量、自动部署工具，不仅可以批量，还可以自动。它主要基于ssh进行通信，不要求客户端(被控制端)安装ansible。","articleContent":"## Ansible介绍\n\n### 什么是Ansible\n\n&#8195;&#8195;ansible是新出现的自动化运维工具，基于Python开发，集合了众多运维工具（puppet、chef、func、fabric）的优点，实现了批量系统配置、批量程序部署、批量运行命令等功能。\\\n&#8195;&#8195;ansible是基于 paramiko 开发的,并且基于模块化工作，本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块，ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents，因为它们是基于ssh来和远\n程主机通讯的。ansible目前已经已经被红帽官方收购，是自动化运维工具中大家认可度最高的，并且上手容易，学习简单。是每位运维工程师必须掌握的技能之一。\n\n### Ansible特点\n\n1. 部署简单，只需在主控端部署Ansible环境，被控端无需做任何操作；\n2. 默认使用SSH协议对设备进行管理；\n3. 有大量常规运维操作模块，可实现日常绝大部分操作；\n4. 配置简单、功能强大、扩展性强；\n5. 支持API及自定义模块，可通过Python轻松扩展；\n6. 通过Playbooks来定制强大的配置、状态管理；\n7. 轻量级，无需在客户端安装agent，更新时，只需在操作机上进行一次更新即可；\n8. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台\n\n### Ansible架构\n\n```shell\n1）Ansible：Ansible的核心程序\n2）Host Lnventory：记录了每一个由Ansible管理的主机信息，信息包括ssh端口，root帐号密码，ip地址等等。可以通过file来加载，可以通过CMDB加载\n3）Playbooks：YAML格式文件，多个任务定义在一个文件中，使用时可以统一调用，“剧本”用来定义那些主机需要调用那些模块来完成的功能。\n4）Core Modules：Ansible执行任何管理任务都不是由Ansible自己完成，而是由核心模块完成；Ansible管理主机之前，先调用core Modules中的模块，然后指明管理Host Lnventory中的主机，就可以完成管理主机。\n5）Custom Modules：自定义模块，完成Ansible核心模块无法完成的功能，此模块支持任何语言编写。\n6）Connection Plugins：连接插件，Ansible和Host通信使用。\n```\n\n### Ansible工作原理\n\n&#8195;&#8195;Ansible 执行任务前，首先与管理主机建立连接，创建$HOME/.ansible/tmp/临时文件夹/，并生成以模块名命名的python 文件，调用subprocess.Popen()方法执行python 脚本，返回任务执行结果，最终删除$HOME/.ansible/tmp/临时文件夹/。不同的是连接是local方式则是在ansible 本端生成临时文件夹其及python 脚本(如synchronize 模块)，而建立的连接是ssh 方式则是在ansible 管理端生成（如copy 模块）。\n\n## Ansible配置\n\n### 环境配置\n\n&#8195;&#8195;Ansible配置以ini格式存储配置数据，在Ansible中⼏乎所有配置都可以通过Ansible的Playbook或环境变量来重新赋值。在运⾏Ansible命令时，命令将会按照以下顺序查找配置⽂件。\n    \n\n```bash\nANSIBLE_CONFIG ：⾸先，Ansible命令会检查环境变量，及这个环境变量指向的配置⽂件。\n./ansible.cfg ：其次，将会检查当前⽬录下的ansible.cf g配置⽂件。\n~/.ansible.cfg ：再次，将会检查当前⽤户home⽬录下的.ansible.cf g配置⽂件。\n/etc/ansible/ansible.cfg ：最后，将会检查在⽤软件包管理⼯具安装Ansible时⾃动产⽣的配置⽂件。\n```\n\n1.用环境变量的方式来配置\\\n大多数Ansible参数可以通过设置带有ANSIBLE_开头的环境变量进行配置，参数名称必须是大写字母。\n    \n\n```bash\nexport ANSIBLE_SUDO_USER=root\n```\n\n设置完环境变量后可以在后续操作中直接引用。\n\n2.设置ansible.cfg配置参数\n\n```bash\ninventory = /root/ansible/hosts\nlibrary = /usr/share/my_modules/\nforks = 5\nsudo_user = root\nremote_port = 22\nhost_key_checking = False\ntimeout = 20\nlog_path = /var/log/ansible.log\n```\n\n- inventory ：该参数表⽰inventory⽂件的位置，资源清单(inventory)就是Ansible需要连接管理的⼀些主机列表。\n- library ：Ansible的所有操作都使⽤模块来执⾏实现，这个library参数就是指向存放Ansible模块的⽬录。\n- forks ：设置默认情况下Ansible最多能有多少个进程同时⼯作，默认5个进程并⾏处理。具体需要设置多少个，可以根据控制端性能和被管理节点的数量来确定。\n- sudo_user ：设置默认执⾏命令的⽤户，也可以在playbook中重新设置这个参数。\n- remote_port ：指定连接被管理节点的管理端⼝，默认是22，除⾮设置了特殊的SSH端⼝，否则不需要修改此参数。\n- host_key_checking ：设置是否检查SSH主机的密钥。可以设置为True或False。即ssh的主机再次验证。\n- timeout ：设置SSH连接的超时间隔，单位是秒。\n- log_path ：Ansible默认不记录⽇志，如果想把Ansible系统的输出记录到⽇志⽂件中，需要设置log_path。需要注意，模块将会调⽤被管节点的(r)syslog来记录，执⾏Ansible的⽤户需要有写⼊⽇志的权限。\n\n### 控制被管理主机\n\n1.利用ssh免密登录进行控制\n    \n\n```bash\nssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''\nssh-copy-id root@192.168.10.10\nssh-copy-id root@192.168.10.11\n```\n\n2.将登录信息写入inventory文件\n    \n\n```shell\n[webserver]\n192.168.10.10 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root\n192.168.10.11 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root\n[dbserver]\n192.168.10.12 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root\n192.168.10.13 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root\n```\n\n### inventory\n\ninventory⽤于定义ansible要管理的主机列表，可以定义单个主机和主机组。上⾯的/etc/ansible/hosts就是默认的inventory。下⾯展⽰了inventory常⽤的定义规则。\n\n```bash\ncat -n /etc/ansible/hosts\n192.168.10.11:22\n192.168.10.12 ansible_ssh_pass=root ansible_ssh_port=22\n[nginx]\n192.168.10.1[3:5]\n[nginx:vars]\nansible_ssh_pass='root'\n[webserver:children]\nnginx\n```\n\n- 第⼀⾏和第⼆⾏单独定义主机，第⼀⾏带上了连接被管节点的端⼝，第⼆⾏带上了单独传递给ssh的参数，分别是\n  ssh连接时的登录远程⽤户的密码参数和ssh的连接端⼝。\n- 第三⾏和第四⾏定义的是nginx主机组，该组中包含了192.168.10.13到15这3台主机。还⽀持字母的扩展，\n  如\"web[a-d]\"。\n- 第五⾏和第六⾏定义了要传递给nginx主机组的变量。若定义为\"[all:vars]\"或\"[*:vars]\"则表⽰传递给所有主机的变\n  量。\n- 第七和第⼋⾏定义了⼀个新的主机组webservers，改组的组成员有nginx组。\n\n可以指定多个inventory配置⽂件，只需在ansible的配置⽂件如/etc/ansible/ansible.cf g中将inventory指令设置为\n对应的⽂件或⽬录即可，如果是⽬录，那么此⽬录下的所有⽂件都是inventory⽂件。\n\n**inventory中常用的内置变量**\n\n```bash\nansible_ssh_host：ansible使⽤ssh要连接的主机。\nansible_ssh_port：ssh的端⼝。默认为22。\nansible_ssh_user：ssh登录的⽤户名。默认为root。\nansible_ssh_pass：ssh登录远程⽤户时的认证密码。\nansible_ssh_private_key_file：ssh登录远程⽤户时的认证私钥。(?)\nansible_connection：使⽤何种模式连接到远程主机。默认值为smart(智能)，表⽰当本地ssh⽀持持久连接(controlpersist)时采⽤ssh连接，否则采⽤python的paramiko ssh连接。\nansible_shell_type：指定远程主机执⾏命令时的shell解析器，默认为sh(不是bash，它们是有区别的，也不是全路径)。\nansible_python_interpreter：远程主机上的python解释器路径。默认为/usr/bin/python。\nansible_*_interpreter：使⽤什么解释器。例如，sh、bash、awk、sed、expect、ruby等等。其中有⼏个参数可以在配置⽂件ansible.cf g中指定，但指定的指令不太⼀样，以下是对应的配置项：\nremote_port：对应于ansible_ssh_port。\nremote_user：对应于ansible_ssh_user。\nprivate_key_file：对应于ansible_ssh_private_key_f ile。\nexcutable：对应于ansible_shell_type。但有⼀点不⼀样，excutable必须指定全路径，⽽后者只需指定basename。\n```\n\n## Ansible三种执行方式\n\n### 1.命令行\n\n```bash\nansible-doc -l #查看支持的模块\nansible-doc -s MODEL_NAME #查看模块用法\nansible命令应用基础\nansible all -m ping #查看client端是否正常ping通\n```\n\n### 2.playbooks\n\n&#8195;&#8195;playbook 是 ansible 用于配置，部署，和管理被控节点的剧本。通过 playbook 的详细描述，执行其中的一系列 tasks ，可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ，而被控节点必须要完成。\n\n&#8195;&#8195;使用playbook你可以方便的重用代码，可以移植到不同的机器上面，像函数一样，最大化的利用代码。在你使用Ansible的过程中，你也会发现，你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook，之后管理服务器会变得十分简单。\n\n### 3.roles\n\n&#8195;&#8195;roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲，roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中，并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中，但也可以是用于构建守护进程等场景中。\n\n\n之后的文章中会详细介绍Ansible一些常用模块以及三种模式的使用方式。","categoryId":3,"viewCount":984,"categoryName":"Ansible","author":"球接子","authorAvatar":null,"tagIds":[3],"tagNames":["Ansible"]}}