运维工具的分类:

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 [-f forks] [-m module_name] [-a args],arg:可以有多个参数key=value

注:注意: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