ansible基础用法~八周目

ansible

ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet,cfengfunc,fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。  
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的ansible所运行的模块。ansible只是提供了一种框架/主要包括:  
    ①,链接插件connnection plugins:负责和监控端实现通信;
    ②,host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
    ③,各种模块核心、command模块、自定义模块;
    ④,借助于插件完成记录日志邮件等功能;
    ⑤,playbook:剧本执行多个任务时,非必须可以让节点一次运行多个任务。 

特性

①模块化:调用特点模块,完成特定任务
②有paramkio,pyyaml,jinja2(模块语言)三个
关键模块
③支持自定义模块
④基于python语言
⑤支持playbook编排任务
⑥等幂性
⑦无需代理不依赖PKI(无需ssl)
⑧可是使用任何语言编写模块
⑨YAML格式,编排任务

安装

yum install ansible -y

相关文件

配置文件
    /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
    /etc/ansible/hosts 主机清单
    /etc/ansible/roles/ 存放角色目录
程序
    /usr/bin/ansible 主程序,临时命令执行工具
    /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
    /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
    /usr/bin/ansible-pull 远程执行命令工具
    /usr/bin/ansible-vault 文件加密工具
    /usr/bin/ansible-console 基于console界面与用户交互的执行工具

ansible语法格式

ansible “主机清单” -m “模块” -a “模块语法”

ansible 基本文件类模块参数

src参数:用于指定需要copy的文件]或目录

dest参数:用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数

content参数:当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。

force参: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。

backup参数:  当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。

owner参数: 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。

group参数: 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。

mode参数: 指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r--r--",则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。

encrypt 加密
decrypt 解密
view 查看
edit 编辑加密文件
rekey 修改口令
create 创建新文件

ansible基本程序类模块参数

name参数:指定程序服务名

state参数:指定对程序采取何种操作
    安装present
    卸载absent
    启动started
    停止stopped
    重启restarted
    重读配置文件reloaded
    开机自启enabled=yes

ansible常用模块

Shell:在远处主机上执行命令,非默认模块,改为默认模块后可忽略-m 选项
    ansible all -m shell -a ‘echo magedu |passwd –stdin wang’ 
注:上句中all表示主机清单里面所有远程主机,下同。
将shell设为默认模块:
    vim /etc/ansible.cfg
        module_name=shell

Script:在远处主机上运行ansible服务器的脚本
    ansible all -m script -a /data/f1.sh

Copy:从主控端复制文件到远程主机
    ansible all -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”

Fetch:从远程主机提取文件至主控端,与Copy相反
    ansible all -m fetch -a ‘src=/root/a.sh dest=/data/scripts’ 

File:设置文件属性
    ansible all -m file -a "path=/root/a.sh owner=wang mode=755“
    ansible all -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’

Cron:计划任务,支持时间:minute,hour,day,month,weekday
    ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate
    172.16.0.1 &>/dev/null' name=Synctime" 

Yum:管理包
    ansible all -m yum -a 'name=httpd state=present'
    ansible all -m yum -a 'name=httpd state=absent'

Service:管理服务
    ansible all -m service -a 'name=httpd state=stopped'
    ansible all -m service -a 'name=httpd state=started enabled=yes'
    ansible all -m service -a 'name=httpd state=reloaded’
    ansible all -m service -a 'name=httpd state=restarted'

User:管理用户 
    ansible srv -m user -a 'name=user1 comment=“test user” uid=2048
    home=/app/user1 group=root‘
    ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’

Group:管理组
    ansible srv -m group -a name=testgroup system=yes“
    ansible srv -m group -a name=testgroup state=absent" 

Vault 管理加密解密yml文件
    ansible-vault encrypt hello.yml 
    ansible-vault decrypt hello.yml 
    ansible-vault view hello.yml 
    ansible-vault edit hello.yml 
    ansible-vault rekey hello.yml
    ansible-vault create new.yml

YML语法

语法要求
    ①在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
    ②次行开始正常写Playbook的内容,一般建议写明该playbook的功能
    ③使用#号注释代码
    ④缩进必须是统一的,不能空格和tab混用
    ⑤缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
    ⑥YAML文件内容是区别大小写的,k/v的值均需大小写敏感
    ⑦多个k/v可同行写也可换行写,同行使用,分隔v可是个字符串,也可是另一个列表
    ⑧一个完整的代码块功能需最少元素需包括 name 和 task
    ⑨一个name只能包括一个task
    ⑩YAML文件扩展名通常为yml或yaml

示例①
    name: John Smith
    age: 41
    gender: Male
    spouse:
      name: Jane Smith
      age: 37
      gender: Female
    children:
      - name: Jimmy Smith
        age: 17
        gender: Male
      - name: Jenny Smith
        age 13
        gender: Female

示例②:
        ---
    #test httpd role
    - hosts: websrvs:appsrvs

    roles:
      - role: httpd
        tags: web
        when: ansible_distribution_major_version == "6"
      - role: nginx
        tags: web2
        when: ansible_distribution_major_version == "7"

playbook

基础组件:
    hosts:用于指定要执行指定任务的主机,须事先定义在主机清单中
    可以是如下形式:
        one.example.com
        one.example.com:two.example.com
        192.168.1.50
        192.168.1.*
        Websrvs:dbsrvs 或者,两个组的并集
        Websrvs:&dbsrvs 与,两个组的交集
        webservers:!phoenix 在websrvs组,但不在dbsrvs组
        示例: - hosts: websrvs:dbsrvs

    tasks:任务列表
        每个task都应该有其name,用于playbook的执行结果输出。
    示例:
        tasks:
        - name: disable selinux
          command: /sbin/setenforce 0

常用选项
    --check -C 只检测可能会发生的改变,但不真正执行操作
    --list-hosts 列出运行任务的主机
    --list-tags 列出tag
    --list-tasks 列出task
    --limit 主机列表 只针对主机列表中的主机执行
    -v -vv -vvv 显示过程
示例
    ansible-playbook file.yml --check 只检测
    ansible-playbook file.yml
    ansible-playbook file.yml --limit websrvs

Roles

roles通过分别将变量、文件、任务、模板及处理器至于单独的目录中,并可以便捷的include它们的一种机制。角色一般用于基于主机构建的场景中,但也可以是用于构建守护进程等场景中

各目录作用
/roles/project/:项目名称,以下子目录
    files/ :存放由copy或script模块等调用的文件
    templates/:template模块查找所需要模板文件的目录
    tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
    handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
    vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包z
    meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为
    main.yml的文件,其它文件需在此文件中通过include进行包含
    default/:设定默认变量时使用此目录中的main.yml文件

创建role
    1,创建以roles命名的目录
    2,在roles下创建以角色命名的子目录,如httpd,nginx等
    3,在角色目录下创建files,handlers,meta,tasks,templates,vars等
    4,在playbook文件中,调用个角色

调用角色方法
    -hosts: all
     remote_user: root

     roles:
       - mysql
       - nginx

示例:远程主机安装httpd服务
    tree roles/httpd/
        roles/httpd/
        ├── files
        │   ├── httpd6.conf
        │   ├── httpd7.conf
        │   └── index.html
        └── tasks
            ├── conf.yml
            ├── data.yml
            ├── install.yml
            ├── main.yml
            └── service.yml

        2 directories, 8 files

    cat roles/httpd/tasks/*.yml
        - name: conf6
          copy: src=files/httpd6.conf dest=/etc/httpd/conf/httpd.conf 
          when: ansible_distribution_major_version ==  "6"

        - name: conf7
          copy: src=files/httpd7.conf dest=/etc/httpd/conf/httpd.conf 
          when: ansible_distribution_major_version ==  "7"
        - name: data
          copy: src=files/index.html dest=/var/www/html/

        - name: install
          yum: name=httpd

        - include: install.yml
        - include: data.yml
        - include: conf.yml
        - include: service.yml

        - name: service
        service: name=httpd state=started enabled=yes

    cat role-httpd.yml 
        - hosts: all
          roles: 

            - role: httpd

    检查语法是否错误
        ansible-playbook role-httpd.yml -C 

    执行命令    
        ansible-playbook role-httpd.yml

以上。
共勉!

转载于:https://blog.51cto.com/14234169/2385755

你可能感兴趣的:(ansible基础用法~八周目)