运维工具的分类:
agent: puppet, func
agentless: ansible(ssh通信), fabric
ansible:模块化,调用特定的模块,完成特定的任务;基于Python语言实现,由Paramiko、PyYAML和Jinja2三个关键模块;
配置文件:
/etc/ansible/ansible.cfg
默认主机清单:/etc/ansible/hosts,添加主机/主机组
open-ssh
基于密钥的认证;
(1) 在本地主机生成一对儿密钥:
ssh-keygen [-q] [-b bits] [-t type] [-f output_keyfile] [-P passphrase]
-t {rsa|ecdsa|dsa}:公钥加密算法类型;rsa默认2048 [-N new_passphrase]
-b bits:指明密钥长度;
-P passphrase:私钥加密密码;
-f output_keyfile:生成密钥的保存位置;
(2) 在本地主机上,将公钥复制到要登录的远程主机的某用户的家目录下的特定文件中(~/.ssh/authorized_keys)
ssh-copy-id [-i [identity_file]] [-p port] [-o ssh_option] [user@]hostname
eg: ssh-copy-id -i .ssh/id_rsa.pub centos@hostip /root/.ssh/id_rsa.pub
复制秘钥至对应主机:
ansible ping模块测试远程主机是否能通信:
用法:ansible
注:注意:command/shell模块要执行命令无须为key=value格式,而是直接给出要执行的命令即可
ansible-doc: Show Ansible module documentation查看模块文档:
-l, --list List available modules
-s, --snippet Show playbook snippet for specified module(s)展示模块使用片段
如:查看user的用法:ansible-doc -s user 会列出user的使用参数;
yum :管理yum程序包
-a 'name= state={present|latest|absent}'name=:程序名称可带版本号
service:程序服务管理
-a 'name= state={started|stopped|restarted} enabled=0|1' runlevel= 默认2345
shell:在远程主机在shell进程下运行命令,支持shell特性如管道
-a 'COMMAND'
script:脚本
-a '/path/to/scrip'
setup Gathers facts about remote hosts 内置变量
eg: ansible web -m setup 查询web主机的内置变量 参数
.....
编写playbook.yaml文件来执行任务:
playbook的基础组件:
Hosts:运行指定任务的目标主机 可以是多个主机,:号分隔
remoute_user:在远程主机上执行任务的用户
sudo_user:用户已何种身份运行
tasks:任务列表 幂等性,若某个任务失败即终止
模块,模块参数
格式:两种
(1)action:module argument
(2)module:arguments 建议这种格式更通用
某任务的状态在运行后为changed时,可以通过“notify"通知给相应的handlers;任务可以通过“tags”打标签,而后可用ansible-playbook -t name调用
eg:给web主机创建用户组agroup,并添加auser用户:
playbook运行方式:ansible-playbook : Runs Ansible playbooks, executing the defined tasks on the targeted hosts.
用法:ansible-playbook [options] playbook.yml [playbook2 ...]
-C, --check: dry-run模式 测试可能发生改变
--list-hosts 列出运行的主机
-t --tags only run plays and tasks tagged with these values
eg:编辑一个任务安装httpd提供配置文件并启动:
验证结果:
handles:任务在特定条件下触发;接收到其他任务通知
如定义:notify 某任务的状态在运行后为changed时,可以通过“notify"通知给相应的handlers
如修改httpd.conf listen 80:
检测运行结果conf文件发生改变,并触发事件,但发现任务每执行一次都会全部运行一遍:
改进:给tags标签指定运行某段程序:,如不指定任何tag,则会全部都运行一遍.也可以命名标签一样,表示都运行,可以有多个标签;
在notify:前添加: tags:changes arg
运行ansible-playbook -t name 指明运行:
variables:
1.facts :可直接调用 内置变量 由 setup模块提供
2.ansible-playbook命令行中的自定义变量
3.通过roles传递变量
4.Host Inventory 在/etc/ansible/hosts中编辑
template:jinja2,文本文件,嵌套有脚本使用模板编程语言;
在template中调用变量,在hosts主机中IP 后添加变量:port =808
远程主机中已发生变化:
条件测试:根据主机操作系统或者其他配置不一样提供不同配置,安装不同配置,安装程序包源
when语句:在task中使用,jinja2语法
task:判断系统版本提供不同的配置文件
- name:install conf file to centos7
template: src=files/nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version="6"
循环:迭代,需要重复执行 的任务,对迭代项引用,固定变量名为“item”而后,要在task中使用with_item给定要迭代的元素列表
列表方法:字符串、字典
注:编写playbook时比较容易出错的地方:“- host”、模块后: argument之间有空格。
roles:
角色:roles定义不同的角色,根据需要调用不同的组件
roles/{mysql/ | httpd/ | nginx/...}
每个角色,以特定的层级结构进行组织:
mysql/
files/:存放由copy或script模块等调用的文件
templatess/template模块查找所需要模板文件的目录
tasks/:至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含;
handlers/:至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
vars/:应当包含一个main.yml文件,用于定义此角色用到的变量;
meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系,其他的文件需要在此文件中通过include进行包含
default/:设定默认变量时使用此目录中的main.yml文件
创建role和使用的步骤
(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4) 在创建的目录里编辑任务,将playbook的内容分解至各个目录
(5)编写playbook调用角色
在playbook调用角色:
-hosts:webs
remote_user:root
roles:
-mysql
-httpd