自动化利器 Ansible - 从了解到应用( 五 )


文章插图
Ansible Dynamic Inventory

  • 动态Inventory也就是Ansible所有的Inventory文件里面的主机列表和变量信息都支持从外部拉取 , 例如CMDB等 。
  • 避免主机列表不准确和频繁大量的手动更新的问题
  • 也可以通过设置ansible.cfg文件中的inventory参数为一个可执行脚本,将CMDB等其他系统的主机信息同步至Ansible中 。
  • 对动态Inventory脚本的参数和输出必须遵循格式规则
Ansible Inventory分割通过Inventory分割满足如下需要
  • 按不同业务/系统分割成的多个Inventory文件
  • 同时使用常规Inventory文件和动态Inventory脚本
实现方式
  • 配置ansible.cfg文件的hostfile参数,指定放置inventory文件目录作为Inventory,Ansible将合并目录里所有文件为一个完整的Inventory
  • 也可以在命令行中使用-i命令来指定特定的Inventory文件
[defaults]hostfile = /etc/ansible/inventory# 指定目录作为InventoryAnsible 剧本执行Ansible Playbook 基础介绍剧本(Playbook) 是 ansible 用于配置 , 部署,和管理被控节点的剧本 。
  • playbook类似Linux的shell脚本,用于实现和管理大量的、规律的、复杂的操作任务
  • playbook方便代码和配置的重用、移植性好,同时也易于管理
Playbook格式
# playbook文件由YMAL语言编写,需遵循yaml格式要求1. 第一行以 "---" 开始 , 表明YMAL文件的开始(非playbook强制要求,没有也能通过语法检查)2. 列表元素以”-”开头 , 后面带有一个空格,然后元素内容3. 对象的键与值以":"和一个空格来分隔4. 相同层次内容必须保持相同的缩进和对齐,否则会报错5. 在同一行中,“#” 之后的内容表示注释6. 文件名应该以.yml或.yaml结尾# 编写完成后可以通过 --syntax-check 子命令检查语法错误ansible-playbook --syntax-check sample.yamlPlaybook组成
  • 一个Playbook可以包括一个或多个Play 。
  • 一个Play由Host的无序集合与Task的有序列表组成 。
  • 每一个Task仅由一个模块构成 。
    自动化利器 Ansible - 从了解到应用

    文章插图
# play- 一个Playbook包括一个或多个Play- 一个Play由Host的无序集合与Task的有序列表组成# 目标定义部分:host- 执行playbook的主机信息# 变量定义部分:variable- 执行playbook需要的变量- 设置的ansible配置变量 , 例如gather_facts# 任务定义部分:tasks & module- 在目标主机执行的任务列表和调用的模块- Play的主体部分,Task列表中的各任务按次序逐个在Hosts中的指定主机上执行- 每一个Task仅由一个模块构成- 建议为每一个Task设置一个Name,便于在运行Playbook时从输出结果辨别task信息- Ansible的自带模块Command模块和Shell模块无需使用key=value格式,可以直接编写要执行的命令# 触发器定义部分:handlers- task执行完成后需要调用的任务,通常结合关键字notify- 由通知者进行的Notify,如果没有被Notify,则Handlers不会执行,如果被Notify了 , 则Handlers被执行- 不管有多少个通知者进行了Notify , 等到Play中的所有Task都执行完成之后 , Handlers也只会被执行一次- 实质上也是Task的列表Ansible Playbook 示例[root@test01 ansible-test]# pwd/root/ansible-test[root@test01 ansible-test]#[root@test01 ansible-test]# lltotal 4drwxr-xr-x 2 root root24 Oct 17 09:47 conf-rw-r--r-- 1 root root 922 Oct 14 11:24 sample.yaml[root@test01 ansible-test]#[root@test01 ansible-test]# tree.├── conf│└── httpd.conf└── sample.yaml1 directory, 2 files[root@test01 ansible-test]#[root@test01 ansible-test]# cat conf/httpd.confMaxClients{{ maxClients }}Listen{{ httpd_port }}[root@test01 ansible-test]#[root@test01 ansible-test]# cat sample.yaml- hosts: taremote_user: vipxfgather_facts: novars:- package: vimtasks:- name: install vimyum: name={{ package }} state=latest- name: install configuration filebecome: yesbecome_method: subecome_flags: "-"become_user: roottemplate: src=https://www.huyubaike.com/root/ansible-test/conf/httpd.conf dest=/root/test-template.confnotify:- check-hostname-date- name: copy filecopy: src=/root/ansible-test/conf/httpd.conf dest=/home/vipxf/test-copy.confhandlers:- name: check-hostname-dateshell: hostname && dateignore_errors: True- hosts: taremote_user: vipxfgather_facts: nobecome: yesbecome_method: subecome_flags:"-"become_user: rootvars:- newgroup: testgroup- newuser: testusertasks:- name: create new groupgroup: name={{ newgroup }} system=yes- name: create new useruser: name={{ newuser }} group=testgroup system=yes[root@test01 ansible-test]#[root@test01 ansible-test]# cat /etc/ansible/hosts[ta]172.20.8.247 ansible_ssh_port=2222 ansible_ssh_user=vipxf ansible_ssh_pass=Anliven09![ta:vars]httpd_port=80 maxClients=10[root@test01 ansible-test]#

推荐阅读