• 自动化运维工具之Ansible


    ansible简介

    特性

    • 模块化: 调用特定的模块,完成特定的任务.
    • 有 Paramiko, PyYAML , Jinja2 (模板语言) 三个关键模块
    • 支持自定义模块
    • 基于 Python 语言实现
    • 部署简单, 基于 python 和 SSH (默认已安装),agentless
    • 安全,基于OpenSSH
    • 支持 playbook 编排任务
    • 幂等性
    • 无需代理不依赖 PKI (无需 ssl)
    • 可以使用任何编程语言写模块
    • Yaml格式,编排任务,支持丰富的数据结构
    • 较强大的多层解决方案

    Ansible 主要组层部分

    • Ansible Playbooks: 任务剧本(任务集) ,编排定义 Ansible 任务集的配置文件, 由 Ansible 顺序依次执行,桐城市 Json格式的 YML文件
    • Inventory: Ansible 管理主机的清单 /etc/anaible/hosts
    • Modules: ansible 执行命令的功能模块,多数为内置的核心模块,也可自定义
    • Plugins: 模块功能的补充,如链接类型插件,循环插件,变量插件,过滤插件等,不常用
    • API: 提供第三方程序调用的应用程序编程接口
    • Ansible: 组合Inventopy,API,modules,plugins的绿框,可以理解为是 ansible 命令工具,其为核心执行工具
    • Ansible 命令执行来源:
      • User, 普通用户, 即 system administrator
      • CMDB(资产管理系统) API 调用
      • PUBLIC/PRIVATE Cloud API调用
      • USER - Ansible Playbook - Ansibile
    • 利用ansible 管理的方式
      • Ad-Hoc 即 ansible命令,主要用于临时命令使用场景
      • Ansible-Playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

     相关文件

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

    Ansible 文件配置

      ansible 通过 ssh 实现配置管理,应用部署,任务执行等功能,因此,需要实现配置 ansible 端能基于秘钥认证的方式联系各被管理节点

      ansible 命令用法

    ansible <host-pattern> [-m module_name] [-a args]
            --version #显示版本
            -m module  # 指定模块,默认为 command
            -v     # 详细过程 -vv -vvv 更详细的
            --list-hosts  # 显示主机列表,可简写 --list
            -k, --ask-pass    # 显示连接密码,默认key验证
            -C,--check        # 检查,并不执行
            -T, --timeout=TIMEOUT  # 执行命令的超时时间,默认10s
            -u, --user = REMOTE_USER    # 执行远程执行的用户
            -b, --become     # 代替旧版的 sudo 切换

    主配置文件ansible.cfg 配置

    [default]
    inventory  = /etc/ansible/host        # 主机列表配置文件
    library = /usr/share/my_modules    # 哭文件存放目录
    remote_tmp = $HOME/.ansible/tmp    # 临时py命令文件存放在运城主机目录
    local_tmp    =  $HOME/.ansible/tmp     # 本机的临时命令执行目录
    forks = 5        # 默认并发数
    sudu_user    = root # 默认sudo用户
    ask_sudo_pass = True    # 每次执行 ansible 命令是否询问ssh密码
    ask_pass = True
    remote_port = 22
    host_key_checking = False # 检查对应服务器的host_key,建议取消注释
    log_path = /var/log/ansible.log  # 默认日志 建议开启

    主机清单 hosts 配置

    # 分组配置,一台主机可以再多个组内, 默认 分组 all 全部主机
    [web]
    172.16.0.40
    
    [db]
    172.16.0.40
    172.16.0.41
    
    # 
    www[001:006].example.com
    

    ansible 命令执行过程

    1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2. 加载自己对应的模块文件 如: command
    3. 通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py 文件
    4. 给文件 +x 执行权限
    5. 执行并返回结果
    6. 删除临时 py 文件, sleep 0 退出
    
    # 执行状态
    绿色: 执行成功并且不需要做改变的操作
    黄色: 执行成功并且对目标主机做变更
    红色: 执行失败
    

    模块

    command

    #在远程主机执行命令,默认模块,可忽略 -m 选项,变量 重定向 管道符等有问题,需要使用 shell模块
    # command    
    
        - chdir    # 改变工作目录
    ~]# ansible all -m command -a "chdir=/var/log/ ls"
    
        - creates    # 如果文件存在 则不执行后续命令
    ~]# ansible all -m command -a "creates=/etc/fstab ls /" 
    172.16.0.40 | SUCCESS | rc=0 >>
    skipped, since /etc/fstab exists
    172.16.0.41 | SUCCESS | rc=0 >>
    skipped, since /etc/fstab exists
    
        - removes    # 如果文件存在 则执行后续命令 
    ~]# ansible all -m command -a "removes=/etc/fstab ls /"
    
    # shell     # 和 command 相似,用shell 执行命令 命令要用单引号
    ~]# ansible all -m shell -a 'echo $HOSTNAME'
    
    # Script : 运行脚本, 本机脚本在远程主机上运行
    ~]# ansible all -m script -a '/data/test.sh'
    
    # copy 从服务器复制文件到客户端
    ~]# ansible all -m copy -a 'src=/data/test.sh dest=/data/ backup=yes mode=600 owner=test'
    ~]# ansible all -m copy -a 'content="df -h hostname ls " dest=/data/f1.sh' # src 源文件 # dest 目标文件 # backup=yes 如果存在同名文件是否备份 # mode 文件权限 # owner 所有者
    # content 把内容写到某个文件

    Fetch

      从客户端去文件至服务器

    和 copy 模块相反,不能抓取目录,目录可先tar
    
    ~]# ansible all -m fetch -a 'src=/etc/passwd dest=/data'
    
    ~]# tree /data/
    /data/
    ├── 172.16.0.40
    │   └── etc
    │       └── passwd
    ├── 172.16.0.41
    │   └── etc
    │       └── passwd
    

    file  

      设置文件属性,管理文件

    # 创建一个空文件
    ~]# ansible all -m file -a 'path=/data/testfile state=touch mode=600 owner=test group=test'
    # 创建连接文件
    ~]# ansible all -m file -a 'src=/data/testfile path=/tmp/testfile-link state=link'
    # 创建空文件夹
    ~]# ansible all -m file -a 'path=/data/test1 state=directory'
    # 删除文件夹
    ~]# ansible all -m file -a 'path=/data/test1 state=absent'
    

    Hostname

      管理主机名

    ~]# ansible 172.16.0.41 -m hostname -a 'name=test-node1'

    cron 

      定时任务模块 

    # 支持时间 minute,  hour, day, month, weekday
    
    # 周六周日 每隔五分钟 打印一条消息
    ~]# ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 禁用 定时任务
    ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 取消禁用
    ~]# ansible all -m cron -a 'disabled=no job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 删除计划任务
    ~]# ansible all -m cron -a 'state=absent job="/usr/bin/wall cron job" name="test cronjob"'
    

    yum

      软件包管理

    # 安装软件包
    ~]# ansible all -m yum -a 'name=httpd state=present'
    
    # 删除软件包
    ~]# ansible all -m yum -a 'name=httpd state=absent'
    
    # 安装最新版本
    ~]# ansible all -m yum -a 'name=httpd state=latest'
    
    # 临时禁用 gpg 检查
     ~]# ansible all -m yum -a 'name=httpd state=present disable_gpg_check=yes'
    
    # 更新缓存
    ~]# ansible all -m yum -a 'name=httpd,vsftpd state=present disable_gpg_check=yes update_cache=yes'
    

    service

      管理服务

    ~]# ansible all -m service -a 'name=httpd state=stopped enabled=yes'
    ~]# ansible all -m service -a 'name=httpd state=started'
    ~]# ansible all -m service -a 'name=httpd state=restarted'
    

    user

      管理用户

    # 添加用户,指定: 备注,uid,家目录,主组,附属组
    ~]# ansible all -m user -a 'name=test2 comment="test user2" uid=2000 home=/data/test2 group=test groups=root,bin'
    ~]# ansible all -a 'getent passwd test2'
    172.16.0.40 | CHANGED | rc=0 >>
    test2:x:2000:1001:test user2:/data/test2:/bin/bash
    
    # 添加系统用户 ,shell 类型 
    ~]# ansible all -m user -a 'name=sysuser system=yes shell=/sbin/nologin'
    
    # 删除用户
    ~]# ansible all -m user -a 'name=sysuser state=absent'
    
    # 删除用户同时删除家目录
    ~]# ansible all -m user -a 'name=test2 state=absent remove=yes'

    group

      管理组

    # 添加组
    ~]# ansible all -m group -a 'name=group1'
    
    # 查看组
    ~]# ansible all -a 'getent group group1'
    
    # 删除组
    ~]# ansible all -m group -a 'name=group1 state=absent'

    其他常用命令

    常用命令

    ansible-galaxy

    • 连接 https://galaxy.ansible.com 下载相应的 roles
    • 列出所有已经安装的 galaxy
      • ansible-galaxy list
    • 安装 galaxy
      • ansible-galaxy install geerlingguy.nginx
    • 删除 galaxy
      • ansible-galaxy remove geerlingguy.nginx

    ansible-pull

    • 推送命令至远程, 效率无限提升,对运维要求比较高

    ansible-playbook

    • ansible-playbook hello.yml
    • ansible-playbook --check hello.yml # 测试执行

    ansible-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 hello.yml    # 创建新文件
    

    Playbook

      playbook 是由一个或者多个 "play" 组成的列表.

      play 的主要功能在于将事先归并为一组的主机装扮成事先通过 ansible 中的 task 定义好的角色. 从根本上来讲一个task 调用 ansible 的 module .将多个 play 组织在一个 playbook 中.

      playbook 采用 YAML 语言编写.

     Playbook 核心元素

    • hosts: 执行的远程主机列表.
    • tasks: 任务集.
    • varniables: 内置变量或自定义变量在 playbook 中调用.
    • templates: 模板,可替换模板文件中的变量并实现一些简单的逻辑文件.
    • handlers: 和notify 结合使用, 由特定条件出发的操作,满足条件才执行.否则不执行.
    • tags: 标签, 指定某任务执行,用于选择运行 playbook 中的部分代码执行.

    示例:

    [root@test1 ansible]# cat httpd.yml 
    ---
    - hosts: all
      remote_user: root
    
      tasks:
        - name: install httpd
          yum: name=httpd
        - name: copy conf file
          copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart httpd.server
          tags: conf
        - name: start httpd.server
          service: name=httpd state=started enabled=yes
      
      handlers:
        - name: restart httpd.server
          service: name=httpd state=restarted

    如果命令或者命令退出代码不为零可以用一下方法解决

    方法1:
      tasks:
        - name: run this command and ignoer the result
          shell: /usr/bin/somecommand || /bin/true
    
    方法2:
      tasks:
        - name: run this command and ignore the result
          shell: /usr/bin/somecommand
          ignore_errors: True

    变量

    变量名的组成:

      变量名仅能由字母,数字,下划线组成,且只能以字母开头.

    变量的定义位置:

    1. ansible setup facts 远程主机的所有变量都可以直接调用.
    2. 在 /etc/ansible/hosts 中定义
      1. 普通变量: 主机组中主机单独定义,优先级高于公共变量.
      2. 公共(组)变量: 针对主机组中所有主机定义统一变量.
    3. 通过命令行 -e 指定变量,优先级最高.
    4.  在 playbook 中定义变量.
    5. 在 role 中定义变量.

     示例:

    1. 普通变量
    [web]
    172.16.0.114 conf_name=httpd.conf
    
    2. 公共组变量
    [web:vars]
    conf_name=httpd.conf.a
    
    3. playbook中定义变量
    ---
    - hosts: all
      remote_user: root
      vars:
        - conf_name: httpd.conf.c
    
    4. 命令行 -e 指定变量
    ansible-playbook -t conf -e conf_name=httpd.conf.b httpd.yml 

    模板templates

      文本文件,嵌套有脚本,(使用模板语言编写).

      Jinja2 语言.

      templates功能: 根据模板文件动态生成对应的配置文件.

      templates 文件必须存放在 templates 目录下, 且命名为 .j2 结尾.

    Janja2常见语法:

    1. 字符串: 使用单引号或者双引号.
    2. 数字: 整数, 浮点数.
    3. 列表: [list1,list2,list3....]
    4. 元祖: (tup1,tup2,tup3....)
    5. 字典{key1:value2,key2:value2....}
    6. 布尔型: true,false
    7. 算术运算: +, -, *, /, //, %, **
    8. 比较运算: ==, !=, >, >=, <, <=
    9. 逻辑运算: and, or, not
    10. 流表达式: for, if, when

      

    ------------恢复内容开始------------

    ansible简介

    特性

    • 模块化: 调用特定的模块,完成特定的任务.
    • 有 Paramiko, PyYAML , Jinja2 (模板语言) 三个关键模块
    • 支持自定义模块
    • 基于 Python 语言实现
    • 部署简单, 基于 python 和 SSH (默认已安装),agentless
    • 安全,基于OpenSSH
    • 支持 playbook 编排任务
    • 幂等性
    • 无需代理不依赖 PKI (无需 ssl)
    • 可以使用任何编程语言写模块
    • Yaml格式,编排任务,支持丰富的数据结构
    • 较强大的多层解决方案

    Ansible 主要组层部分

    • Ansible Playbooks: 任务剧本(任务集) ,编排定义 Ansible 任务集的配置文件, 由 Ansible 顺序依次执行,桐城市 Json格式的 YML文件
    • Inventory: Ansible 管理主机的清单 /etc/anaible/hosts
    • Modules: ansible 执行命令的功能模块,多数为内置的核心模块,也可自定义
    • Plugins: 模块功能的补充,如链接类型插件,循环插件,变量插件,过滤插件等,不常用
    • API: 提供第三方程序调用的应用程序编程接口
    • Ansible: 组合Inventopy,API,modules,plugins的绿框,可以理解为是 ansible 命令工具,其为核心执行工具
    • Ansible 命令执行来源:
      • User, 普通用户, 即 system administrator
      • CMDB(资产管理系统) API 调用
      • PUBLIC/PRIVATE Cloud API调用
      • USER - Ansible Playbook - Ansibile
    • 利用ansible 管理的方式
      • Ad-Hoc 即 ansible命令,主要用于临时命令使用场景
      • Ansible-Playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

     相关文件

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

    Ansible 文件配置

      ansible 通过 ssh 实现配置管理,应用部署,任务执行等功能,因此,需要实现配置 ansible 端能基于秘钥认证的方式联系各被管理节点

      ansible 命令用法

    ansible <host-pattern> [-m module_name] [-a args]
            --version #显示版本
            -m module  # 指定模块,默认为 command
            -v     # 详细过程 -vv -vvv 更详细的
            --list-hosts  # 显示主机列表,可简写 --list
            -k, --ask-pass    # 显示连接密码,默认key验证
            -C,--check        # 检查,并不执行
            -T, --timeout=TIMEOUT  # 执行命令的超时时间,默认10s
            -u, --user = REMOTE_USER    # 执行远程执行的用户
            -b, --become     # 代替旧版的 sudo 切换

    主配置文件ansible.cfg 配置

    [default]
    inventory  = /etc/ansible/host        # 主机列表配置文件
    library = /usr/share/my_modules    # 哭文件存放目录
    remote_tmp = $HOME/.ansible/tmp    # 临时py命令文件存放在运城主机目录
    local_tmp    =  $HOME/.ansible/tmp     # 本机的临时命令执行目录
    forks = 5        # 默认并发数
    sudu_user    = root # 默认sudo用户
    ask_sudo_pass = True    # 每次执行 ansible 命令是否询问ssh密码
    ask_pass = True
    remote_port = 22
    host_key_checking = False # 检查对应服务器的host_key,建议取消注释
    log_path = /var/log/ansible.log  # 默认日志 建议开启

    主机清单 hosts 配置

    # 分组配置,一台主机可以再多个组内, 默认 分组 all 全部主机
    [web]
    172.16.0.40
    
    [db]
    172.16.0.40
    172.16.0.41
    
    # 
    www[001:006].example.com
    

    ansible 命令执行过程

    1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2. 加载自己对应的模块文件 如: command
    3. 通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py 文件
    4. 给文件 +x 执行权限
    5. 执行并返回结果
    6. 删除临时 py 文件, sleep 0 退出
    
    # 执行状态
    绿色: 执行成功并且不需要做改变的操作
    黄色: 执行成功并且对目标主机做变更
    红色: 执行失败
    

    模块

    command

    #在远程主机执行命令,默认模块,可忽略 -m 选项,变量 重定向 管道符等有问题,需要使用 shell模块
    # command    
    
        - chdir    # 改变工作目录
    ~]# ansible all -m command -a "chdir=/var/log/ ls"
    
        - creates    # 如果文件存在 则不执行后续命令
    ~]# ansible all -m command -a "creates=/etc/fstab ls /" 
    172.16.0.40 | SUCCESS | rc=0 >>
    skipped, since /etc/fstab exists
    172.16.0.41 | SUCCESS | rc=0 >>
    skipped, since /etc/fstab exists
    
        - removes    # 如果文件存在 则执行后续命令 
    ~]# ansible all -m command -a "removes=/etc/fstab ls /"
    
    # shell     # 和 command 相似,用shell 执行命令 命令要用单引号
    ~]# ansible all -m shell -a 'echo $HOSTNAME'
    
    # Script : 运行脚本, 本机脚本在远程主机上运行
    ~]# ansible all -m script -a '/data/test.sh'
    
    # copy 从服务器复制文件到客户端
    ~]# ansible all -m copy -a 'src=/data/test.sh dest=/data/ backup=yes mode=600 owner=test'
    ~]# ansible all -m copy -a 'content="df -h hostname ls " dest=/data/f1.sh' # src 源文件 # dest 目标文件 # backup=yes 如果存在同名文件是否备份 # mode 文件权限 # owner 所有者
    # content 把内容写到某个文件

    Fetch

      从客户端去文件至服务器

    和 copy 模块相反,不能抓取目录,目录可先tar
    
    ~]# ansible all -m fetch -a 'src=/etc/passwd dest=/data'
    
    ~]# tree /data/
    /data/
    ├── 172.16.0.40
    │   └── etc
    │       └── passwd
    ├── 172.16.0.41
    │   └── etc
    │       └── passwd
    

    file  

      设置文件属性,管理文件

    # 创建一个空文件
    ~]# ansible all -m file -a 'path=/data/testfile state=touch mode=600 owner=test group=test'
    # 创建连接文件
    ~]# ansible all -m file -a 'src=/data/testfile path=/tmp/testfile-link state=link'
    # 创建空文件夹
    ~]# ansible all -m file -a 'path=/data/test1 state=directory'
    # 删除文件夹
    ~]# ansible all -m file -a 'path=/data/test1 state=absent'
    

    Hostname

      管理主机名

    ~]# ansible 172.16.0.41 -m hostname -a 'name=test-node1'

    cron 

      定时任务模块 

    # 支持时间 minute,  hour, day, month, weekday
    
    # 周六周日 每隔五分钟 打印一条消息
    ~]# ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 禁用 定时任务
    ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 取消禁用
    ~]# ansible all -m cron -a 'disabled=no job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 删除计划任务
    ~]# ansible all -m cron -a 'state=absent job="/usr/bin/wall cron job" name="test cronjob"'
    

    yum

      软件包管理

    # 安装软件包
    ~]# ansible all -m yum -a 'name=httpd state=present'
    
    # 删除软件包
    ~]# ansible all -m yum -a 'name=httpd state=absent'
    
    # 安装最新版本
    ~]# ansible all -m yum -a 'name=httpd state=latest'
    
    # 临时禁用 gpg 检查
     ~]# ansible all -m yum -a 'name=httpd state=present disable_gpg_check=yes'
    
    # 更新缓存
    ~]# ansible all -m yum -a 'name=httpd,vsftpd state=present disable_gpg_check=yes update_cache=yes'
    

    service

      管理服务

    ~]# ansible all -m service -a 'name=httpd state=stopped enabled=yes'
    ~]# ansible all -m service -a 'name=httpd state=started'
    ~]# ansible all -m service -a 'name=httpd state=restarted'
    

    user

      管理用户

    # 添加用户,指定: 备注,uid,家目录,主组,附属组
    ~]# ansible all -m user -a 'name=test2 comment="test user2" uid=2000 home=/data/test2 group=test groups=root,bin'
    ~]# ansible all -a 'getent passwd test2'
    172.16.0.40 | CHANGED | rc=0 >>
    test2:x:2000:1001:test user2:/data/test2:/bin/bash
    
    # 添加系统用户 ,shell 类型 
    ~]# ansible all -m user -a 'name=sysuser system=yes shell=/sbin/nologin'
    
    # 删除用户
    ~]# ansible all -m user -a 'name=sysuser state=absent'
    
    # 删除用户同时删除家目录
    ~]# ansible all -m user -a 'name=test2 state=absent remove=yes'

    group

      管理组

    # 添加组
    ~]# ansible all -m group -a 'name=group1'
    
    # 查看组
    ~]# ansible all -a 'getent group group1'
    
    # 删除组
    ~]# ansible all -m group -a 'name=group1 state=absent'

    其他常用命令

    常用命令

    ansible-galaxy

    • 连接 https://galaxy.ansible.com 下载相应的 roles
    • 列出所有已经安装的 galaxy
      • ansible-galaxy list
    • 安装 galaxy
      • ansible-galaxy install geerlingguy.nginx
    • 删除 galaxy
      • ansible-galaxy remove geerlingguy.nginx

    ansible-pull

    • 推送命令至远程, 效率无限提升,对运维要求比较高

    ansible-playbook

    • ansible-playbook hello.yml
    • ansible-playbook --check hello.yml # 测试执行

    ansible-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 hello.yml    # 创建新文件
    

    Playbook

      playbook 是由一个或者多个 "play" 组成的列表.

      play 的主要功能在于将事先归并为一组的主机装扮成事先通过 ansible 中的 task 定义好的角色. 从根本上来讲一个task 调用 ansible 的 module .将多个 play 组织在一个 playbook 中.

      playbook 采用 YAML 语言编写.

     Playbook 核心元素

    • hosts: 执行的远程主机列表.
    • tasks: 任务集.
    • varniables: 内置变量或自定义变量在 playbook 中调用.
    • templates: 模板,可替换模板文件中的变量并实现一些简单的逻辑文件.
    • handlers: 和notify 结合使用, 由特定条件出发的操作,满足条件才执行.否则不执行.
    • tags: 标签, 指定某任务执行,用于选择运行 playbook 中的部分代码执行.

    示例:

    [root@test1 ansible]# cat httpd.yml 
    ---
    - hosts: all
      remote_user: root
    
      tasks:
        - name: install httpd
          yum: name=httpd
        - name: copy conf file
          copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart httpd.server
          tags: conf
        - name: start httpd.server
          service: name=httpd state=started enabled=yes
      
      handlers:
        - name: restart httpd.server
          service: name=httpd state=restarted

    如果命令或者命令退出代码不为零可以用一下方法解决

    方法1:
      tasks:
        - name: run this command and ignoer the result
          shell: /usr/bin/somecommand || /bin/true
    
    方法2:
      tasks:
        - name: run this command and ignore the result
          shell: /usr/bin/somecommand
          ignore_errors: True

    变量

    变量名的组成:

      变量名仅能由字母,数字,下划线组成,且只能以字母开头.

    变量的定义位置:

    1. ansible setup facts 远程主机的所有变量都可以直接调用.
    2. 在 /etc/ansible/hosts 中定义
      1. 普通变量: 主机组中主机单独定义,优先级高于公共变量.
      2. 公共(组)变量: 针对主机组中所有主机定义统一变量.
    3. 通过命令行 -e 指定变量,优先级最高.
    4.  在 playbook 中定义变量.
    5. 在 role 中定义变量.

     示例:

    1. 普通变量
    [web]
    172.16.0.114 conf_name=httpd.conf
    
    2. 公共组变量
    [web:vars]
    conf_name=httpd.conf.a
    
    3. playbook中定义变量
    ---
    - hosts: all
      remote_user: root
      vars:
        - conf_name: httpd.conf.c
    
    4. 命令行 -e 指定变量
    ansible-playbook -t conf -e conf_name=httpd.conf.b httpd.yml 

    模板templates

      文本文件,嵌套有脚本,(使用模板语言编写).

      Jinja2 语言.

      templates功能: 根据模板文件动态生成对应的配置文件.

      templates 文件必须存放在 templates 目录下, 且命名为 .j2 结尾.

    Janja2常见语法:

    1. 字符串: 使用单引号或者双引号.
    2. 数字: 整数, 浮点数.
    3. 列表: [list1,list2,list3....]
    4. 元祖: (tup1,tup2,tup3....)
    5. 字典{key1:value2,key2:value2....}
    6. 布尔型: true,false
    7. 算术运算: +, -, *, /, //, %, **
    8. 比较运算: ==, !=, >, >=, <, <=
    9. 逻辑运算: and, or, not
    10. 流表达式: for, if, when

      

    ------------恢复内容开始------------

    ansible简介

    特性

    • 模块化: 调用特定的模块,完成特定的任务.
    • 有 Paramiko, PyYAML , Jinja2 (模板语言) 三个关键模块
    • 支持自定义模块
    • 基于 Python 语言实现
    • 部署简单, 基于 python 和 SSH (默认已安装),agentless
    • 安全,基于OpenSSH
    • 支持 playbook 编排任务
    • 幂等性
    • 无需代理不依赖 PKI (无需 ssl)
    • 可以使用任何编程语言写模块
    • Yaml格式,编排任务,支持丰富的数据结构
    • 较强大的多层解决方案

    Ansible 主要组层部分

    • Ansible Playbooks: 任务剧本(任务集) ,编排定义 Ansible 任务集的配置文件, 由 Ansible 顺序依次执行,桐城市 Json格式的 YML文件
    • Inventory: Ansible 管理主机的清单 /etc/anaible/hosts
    • Modules: ansible 执行命令的功能模块,多数为内置的核心模块,也可自定义
    • Plugins: 模块功能的补充,如链接类型插件,循环插件,变量插件,过滤插件等,不常用
    • API: 提供第三方程序调用的应用程序编程接口
    • Ansible: 组合Inventopy,API,modules,plugins的绿框,可以理解为是 ansible 命令工具,其为核心执行工具
    • Ansible 命令执行来源:
      • User, 普通用户, 即 system administrator
      • CMDB(资产管理系统) API 调用
      • PUBLIC/PRIVATE Cloud API调用
      • USER - Ansible Playbook - Ansibile
    • 利用ansible 管理的方式
      • Ad-Hoc 即 ansible命令,主要用于临时命令使用场景
      • Ansible-Playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

     相关文件

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

    Ansible 文件配置

      ansible 通过 ssh 实现配置管理,应用部署,任务执行等功能,因此,需要实现配置 ansible 端能基于秘钥认证的方式联系各被管理节点

      ansible 命令用法

    ansible <host-pattern> [-m module_name] [-a args]
            --version #显示版本
            -m module  # 指定模块,默认为 command
            -v     # 详细过程 -vv -vvv 更详细的
            --list-hosts  # 显示主机列表,可简写 --list
            -k, --ask-pass    # 显示连接密码,默认key验证
            -C,--check        # 检查,并不执行
            -T, --timeout=TIMEOUT  # 执行命令的超时时间,默认10s
            -u, --user = REMOTE_USER    # 执行远程执行的用户
            -b, --become     # 代替旧版的 sudo 切换

    主配置文件ansible.cfg 配置

    [default]
    inventory  = /etc/ansible/host        # 主机列表配置文件
    library = /usr/share/my_modules    # 哭文件存放目录
    remote_tmp = $HOME/.ansible/tmp    # 临时py命令文件存放在运城主机目录
    local_tmp    =  $HOME/.ansible/tmp     # 本机的临时命令执行目录
    forks = 5        # 默认并发数
    sudu_user    = root # 默认sudo用户
    ask_sudo_pass = True    # 每次执行 ansible 命令是否询问ssh密码
    ask_pass = True
    remote_port = 22
    host_key_checking = False # 检查对应服务器的host_key,建议取消注释
    log_path = /var/log/ansible.log  # 默认日志 建议开启

    主机清单 hosts 配置

    # 分组配置,一台主机可以再多个组内, 默认 分组 all 全部主机
    [web]
    172.16.0.40
    
    [db]
    172.16.0.40
    172.16.0.41
    
    # 
    www[001:006].example.com
    

    ansible 命令执行过程

    1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2. 加载自己对应的模块文件 如: command
    3. 通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py 文件
    4. 给文件 +x 执行权限
    5. 执行并返回结果
    6. 删除临时 py 文件, sleep 0 退出
    
    # 执行状态
    绿色: 执行成功并且不需要做改变的操作
    黄色: 执行成功并且对目标主机做变更
    红色: 执行失败
    

    模块

    command

    #在远程主机执行命令,默认模块,可忽略 -m 选项,变量 重定向 管道符等有问题,需要使用 shell模块
    # command    
    
        - chdir    # 改变工作目录
    ~]# ansible all -m command -a "chdir=/var/log/ ls"
    
        - creates    # 如果文件存在 则不执行后续命令
    ~]# ansible all -m command -a "creates=/etc/fstab ls /" 
    172.16.0.40 | SUCCESS | rc=0 >>
    skipped, since /etc/fstab exists
    172.16.0.41 | SUCCESS | rc=0 >>
    skipped, since /etc/fstab exists
    
        - removes    # 如果文件存在 则执行后续命令 
    ~]# ansible all -m command -a "removes=/etc/fstab ls /"
    
    # shell     # 和 command 相似,用shell 执行命令 命令要用单引号
    ~]# ansible all -m shell -a 'echo $HOSTNAME'
    
    # Script : 运行脚本, 本机脚本在远程主机上运行
    ~]# ansible all -m script -a '/data/test.sh'
    
    # copy 从服务器复制文件到客户端
    ~]# ansible all -m copy -a 'src=/data/test.sh dest=/data/ backup=yes mode=600 owner=test'
    ~]# ansible all -m copy -a 'content="df -h hostname ls " dest=/data/f1.sh' # src 源文件 # dest 目标文件 # backup=yes 如果存在同名文件是否备份 # mode 文件权限 # owner 所有者
    # content 把内容写到某个文件

    Fetch

      从客户端去文件至服务器

    和 copy 模块相反,不能抓取目录,目录可先tar
    
    ~]# ansible all -m fetch -a 'src=/etc/passwd dest=/data'
    
    ~]# tree /data/
    /data/
    ├── 172.16.0.40
    │   └── etc
    │       └── passwd
    ├── 172.16.0.41
    │   └── etc
    │       └── passwd
    

    file  

      设置文件属性,管理文件

    # 创建一个空文件
    ~]# ansible all -m file -a 'path=/data/testfile state=touch mode=600 owner=test group=test'
    # 创建连接文件
    ~]# ansible all -m file -a 'src=/data/testfile path=/tmp/testfile-link state=link'
    # 创建空文件夹
    ~]# ansible all -m file -a 'path=/data/test1 state=directory'
    # 删除文件夹
    ~]# ansible all -m file -a 'path=/data/test1 state=absent'
    

    Hostname

      管理主机名

    ~]# ansible 172.16.0.41 -m hostname -a 'name=test-node1'

    cron 

      定时任务模块 

    # 支持时间 minute,  hour, day, month, weekday
    
    # 周六周日 每隔五分钟 打印一条消息
    ~]# ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 禁用 定时任务
    ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 取消禁用
    ~]# ansible all -m cron -a 'disabled=no job="/usr/bin/wall cron job" name="test cronjob"'
    
    # 删除计划任务
    ~]# ansible all -m cron -a 'state=absent job="/usr/bin/wall cron job" name="test cronjob"'
    

    yum

      软件包管理

    # 安装软件包
    ~]# ansible all -m yum -a 'name=httpd state=present'
    
    # 删除软件包
    ~]# ansible all -m yum -a 'name=httpd state=absent'
    
    # 安装最新版本
    ~]# ansible all -m yum -a 'name=httpd state=latest'
    
    # 临时禁用 gpg 检查
     ~]# ansible all -m yum -a 'name=httpd state=present disable_gpg_check=yes'
    
    # 更新缓存
    ~]# ansible all -m yum -a 'name=httpd,vsftpd state=present disable_gpg_check=yes update_cache=yes'
    

    service

      管理服务

    ~]# ansible all -m service -a 'name=httpd state=stopped enabled=yes'
    ~]# ansible all -m service -a 'name=httpd state=started'
    ~]# ansible all -m service -a 'name=httpd state=restarted'
    

    user

      管理用户

    # 添加用户,指定: 备注,uid,家目录,主组,附属组
    ~]# ansible all -m user -a 'name=test2 comment="test user2" uid=2000 home=/data/test2 group=test groups=root,bin'
    ~]# ansible all -a 'getent passwd test2'
    172.16.0.40 | CHANGED | rc=0 >>
    test2:x:2000:1001:test user2:/data/test2:/bin/bash
    
    # 添加系统用户 ,shell 类型 
    ~]# ansible all -m user -a 'name=sysuser system=yes shell=/sbin/nologin'
    
    # 删除用户
    ~]# ansible all -m user -a 'name=sysuser state=absent'
    
    # 删除用户同时删除家目录
    ~]# ansible all -m user -a 'name=test2 state=absent remove=yes'

    group

      管理组

    # 添加组
    ~]# ansible all -m group -a 'name=group1'
    
    # 查看组
    ~]# ansible all -a 'getent group group1'
    
    # 删除组
    ~]# ansible all -m group -a 'name=group1 state=absent'

    其他常用命令

    常用命令

    ansible-galaxy

    • 连接 https://galaxy.ansible.com 下载相应的 roles
    • 列出所有已经安装的 galaxy
      • ansible-galaxy list
    • 安装 galaxy
      • ansible-galaxy install geerlingguy.nginx
    • 删除 galaxy
      • ansible-galaxy remove geerlingguy.nginx

    ansible-pull

    • 推送命令至远程, 效率无限提升,对运维要求比较高

    ansible-playbook

    • ansible-playbook hello.yml
    • ansible-playbook --check hello.yml # 测试执行

    ansible-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 hello.yml    # 创建新文件
    

    Playbook

      playbook 是由一个或者多个 "play" 组成的列表.

      play 的主要功能在于将事先归并为一组的主机装扮成事先通过 ansible 中的 task 定义好的角色. 从根本上来讲一个task 调用 ansible 的 module .将多个 play 组织在一个 playbook 中.

      playbook 采用 YAML 语言编写.

     Playbook 核心元素

    • hosts: 执行的远程主机列表.
    • tasks: 任务集.
    • varniables: 内置变量或自定义变量在 playbook 中调用.
    • templates: 模板,可替换模板文件中的变量并实现一些简单的逻辑文件.
    • handlers: 和notify 结合使用, 由特定条件出发的操作,满足条件才执行.否则不执行.
    • tags: 标签, 指定某任务执行,用于选择运行 playbook 中的部分代码执行.

    示例:

    [root@test1 ansible]# cat httpd.yml 
    ---
    - hosts: all
      remote_user: root
    
      tasks:
        - name: install httpd
          yum: name=httpd
        - name: copy conf file
          copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart httpd.server
          tags: conf
        - name: start httpd.server
          service: name=httpd state=started enabled=yes
      
      handlers:
        - name: restart httpd.server
          service: name=httpd state=restarted

    如果命令或者命令退出代码不为零可以用一下方法解决

    方法1:
      tasks:
        - name: run this command and ignoer the result
          shell: /usr/bin/somecommand || /bin/true
    
    方法2:
      tasks:
        - name: run this command and ignore the result
          shell: /usr/bin/somecommand
          ignore_errors: True

    变量

    变量名的组成:

      变量名仅能由字母,数字,下划线组成,且只能以字母开头.

    变量的定义位置:

    1. ansible setup facts 远程主机的所有变量都可以直接调用.
    2. 在 /etc/ansible/hosts 中定义
      1. 普通变量: 主机组中主机单独定义,优先级高于公共变量.
      2. 公共(组)变量: 针对主机组中所有主机定义统一变量.
    3. 通过命令行 -e 指定变量,优先级最高.
    4.  在 playbook 中定义变量.
    5. 在 role 中定义变量.

     示例:

    1. 普通变量
    [web]
    172.16.0.114 conf_name=httpd.conf
    
    2. 公共组变量
    [web:vars]
    conf_name=httpd.conf.a
    
    3. playbook中定义变量
    ---
    - hosts: all
      remote_user: root
      vars:
        - conf_name: httpd.conf.c
    
    4. 命令行 -e 指定变量
    ansible-playbook -t conf -e conf_name=httpd.conf.b httpd.yml 

    模板templates

      文本文件,嵌套有脚本,(使用模板语言编写).

      Jinja2 语言.

      templates功能: 根据模板文件动态生成对应的配置文件.

      templates 文件必须存放在 templates 目录下, 且命名为 .j2 结尾.

    Janja2常见语法:

    1. 字符串: 使用单引号或者双引号.
    2. 数字: 整数, 浮点数.
    3. 列表: [list1,list2,list3....]
    4. 元祖: (tup1,tup2,tup3....)
    5. 字典{key1:value2,key2:value2....}
    6. 布尔型: true,false
    7. 算术运算: +, -, *, /, //, %, **
    8. 比较运算: ==, !=, >, >=, <, <=
    9. 逻辑运算: and, or, not
    10. 流表达式: for, if, when

     示例:

    目录结构:

    [root@test1 ansible]# tree 
    .
    ├── nginx.yml
    └── templates
        └── nginx.conf.j2 

    算术运算:

    1. nginx.yml
    
    ---
    - hosts: all
      remote_user: root
    
      tasks:
        - name: install nginx
          yum: name=nginx
    
        - name: template config to remote hosts
          template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
          notify: restart nginx
          tags: conf
    
        - name: start nginx
          service: name=nginx state=started enabled=yes
    
      handlers:
        - name: restart nginx
          service: name=nginx state=restarted  
    
    2. nginx.conf.j2
    worker_processes  {{ ansible_processor_vcpus * 3 }};
    

    when

      条件测试: 需要根据变量, facts 或此前任务的执行结果来作为某 task 执行与否的前提条件时用到的条件测试.通过 when 语句实现,在 task 中使用, jinja2 的语法格式.

      在 task 后添加 when 自居即可使用条件测试, when 语句支持 jinja2 表达式语法:

    示例:

    [root@test1 ansible]# cat nginx.yml 
    ---
    - hosts: all
      remote_user: root
    
      tasks:
        - name: install nginx
          yum: name=nginx
    
        - name: template config to remote hosts
          template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
          notify: restart nginx
          tags: conf
          when: ansible_distribution_major_version == "6"

     迭代

      with_items: 当有需要重复性执行的任务时,可以使用迭代机制.

      对迭代项的引用,固定变量名为"item"

      在 task 中使用 with_items 给定要迭代的元素列表.列表格式为: 字符串,字典.

  • 相关阅读:
    丑数——剑指offer面试题34
    把整数排成最小的数——剑指offer面试题33
    从1到n整数中1出现的次数——剑指offer面试题32
    各种排序方法及其比较
    scrapy安装
    水仙花数
    分数化小数(decimal)
    子序列的和
    倒三角
    韩信点兵
  • 原文地址:https://www.cnblogs.com/yanshicheng/p/10671155.html
Copyright © 2020-2023  润新知