Ansible基础记录如下:
Ansible架构图:
ansible核心组件:
- ansible core:Ansible的核心程序
- host iventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等
- core modules:Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机
- custom modules:自定义模块
- playbook(yaml,jinjia2):YAML格式文件,多个任务定义在一个文件中
- connect plugin:连接插件,Ansible和Host通信使用
ansible特性:
- 基于python实现,由Paramike,PyYAML和Jinjia2三个关键模块
- 部署简单,agentless
- 使用ssh协议
- 主从集中化模式
- 支持自定义模块
- 支持playbook
- 幂等性:一种操作可重复多次结果相同
invetory文件说明:
[web01] 192.168.0.1 ansible_ssh_user=root ansible_ssh_pass=xxx [web02] 192.168.0.[2:5] #从2到5的主机 [web03] #对应变量 192.168.0.8 port=80 hostname="test01" 192.168.0.9 port=8080 hostname="test02" [web03:vars] #对web03组定义变量 server1=ttxsgoto1.com server2=ttxsgoto2.com [webservers:children] #组嵌套,webservers组包括web01和web02下的主机 web01 web02 [webservers:vars] #组定义变量 server1=tttxsgoto.com
查看模块帮助信息:
- ansible-doc -l
- ansible-doc -s module_name
ansible命令应用:
ansible
-f forks:启动并发线程数
-m module_name:使用的模块名
-a args:模块特有的参数
常见模块:
- command
- cron
- user
- group
- copy
- file
- ping
- setup
- service
- shell
- script
- yum/apt
cron:计划任务 present: 安装任务 absent:移除任务 ansible local -m cron -a 'minute=*/5 job="/bin/echo abc > /root/abc.log" name="test cron job" state="absent" '
user:用户管理 name:指明添加的用户名 ansible local -m user -a 'name="user1"'
group:用户组管理 ansible local -m group -a 'name=user1 gid=306 system=yes' #添加用户组 ansible local -m group -a 'name=user1 gid=306 system=yes state=absent' #删除用户组
copy:文件复制 src=:定义本地源路径 content=:取代src=,定义内容直接写入到远程文件中 dest=:定义远程路径,绝对路径 ansible local -m copy -a 'src=/etc/fstab dest=/tmp/fstab.bak owner=root mode=777' ansible local -m copy -a 'content="hello wrold\nabc\n" dest=/tmp/fstab.bak owner=root mode=777'
file:文件管理属性 path=: 指明文件路径,可以使用name、dest来替换 ansible local -m file -a ' owner=bigdata group=bigdata mode=644 path=/tmp/fstab.bak' #修改权限和组信息 ansible local -m file -a 'path=/tmp/fstab.bak.link src=/tmp/fstab.bak state=link' #软链接
ping:测试主机联通性 ansible local -m ping
setup:收集远程主机的facts 每个被管理节点会将自己相关的信息发生给远程的ansible主机,用于模板调用变量 ansible local -m setup
service:常用服务的运行状态 enabled=: 开机自启动,为true和false name=: 服务名称 state=: 启动状态,started,stopped,restarted; ansible local -m service -a "enabled=true name=nginx state=started"
shell:远程执行命令,可传递参数 用到管道等功能的复杂命令时使用shell命令 ansible local -m shell -a "echo xxx | passwd --stdin user1"
script:将本地脚本在远程上执行 注意:使用相对路径指定脚本 ansible local -m script -a "./test.sh"
yum/apt: 安装程序包 name=: 需要安装的程序包,可以加版本号 state=: present,lastest安装,absent表示卸载 ansible local -m yum -a "name=zsh" #安装 ansible local -m apt -a "name=zsh state=absent" #卸载
playbook:通过yaml将多个模块组装起来运行多个任务
组成结构:
Playbooks:
Tasks:任务列表
Variables:变量
Templates:模板
Handlers:处理器,由某事件触发执行的操作
Roles:角色
运行说明:
0)yaml语法检测
ansible-playbook –syntax-check /path/to/playbook.yaml
1)yaml测试运行
ansible-playbook -C /path/to/playbook.yaml
2)运行
ansiable-playbook /path/to/playbook.yml
-t TAGS #给指定的任务定义一个调用标识
--tags=TAGS #给指定的任务定义一个调用标识
--skip-tags=SKIP_TAGS #跳过指定的标签
--start-at-task=START_AT #从哪个任务后执行
--list-tags #查看标签
基本结构:
例子1: - hosts: webservers remote_user: root tasks: - name: create nginx group group: name=nginx system=yes gid=208 - name: create nginx user user: name=nginx uid=208 system=yes - hosts: dbservers remote_user: root tasks: - name: copy file to dbsrvs copy: src=/etc/inittab dest=/tmp/inittab.bak
例子2(handler,vars): - hosts: webservers remote_user: root vars: - package: httpd - service: httpd tasks: - name: install httpd package yum: name={{ package }} state=lastest - name: install configuration file for httpd copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: start httpd service service: enabled=true name=httpd state=started handlers: - name: restart httpd service: name=httpd state=restarted - name: copy file copy: content="{{ ansible_all_ipv4_addresses }}" dest=/tmp/test.txt
例子3(条件测试): - hosts: webservers remote_user: root vars: - username: user1 tasks: - name: create {{ username }} user: name={{ userneam }} when: ansible_fqdn == 'ttxsgoto'
例子4(迭代-for): - hosts: webservers remote_user: root - name: add username user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - {name:'testuser1',groups='user1'} - {name:'testuser2',groups='user2'} - hosts: webservers remote_user: root - name: add username user: name={{ item }} state=present groups=group1 with_items: - testuser1 - testuser2
例子5(templates/tags ansible-playbook test.yml --tags='conf_chage'): #tags: 在playbook可以为某个任务定义一个标签,在执行playbook时,通过tags可实现仅运行指定tasks任务 - hosts: webservers remote_user: root vars: - package: httpd - service: httpd tasks: - name: install httpd package yum: name={{ package }} state=lastest - name: install configuration file for httpd template: src=/root/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf tags: - conf_chage notify: - restart httpd - name: start httpd service service: enabled=true name=httpd state=started handlers: - name: restart httpd service: name=httpd state=restarted
roles:用于层次化、结构化的组织playbook;role能够根据层次结构自动装载变量文件、task以及handlers等,要使用roles只需要在playbook中使用include指令;roles通过分别将变量、文件、任务、模块及处理器放置在单独的目录中,并可以便捷地通过include它们的一种机制,角色一般用于基于主机构建服务的场景中;无实例,用到时在记录