Ansible 总结

ansible 的 Host-pattern 逻辑与正则

逻辑与

ansible "webservs:&dbservs" -m ping

在webservs组并且在dbservs组中的主机

逻辑非

ansible 'webservs:!dbservs' -m ping

在webservs组,单不在dbservs组中的主机

注意:此处为单引号

综合逻辑

ansible 'webservs:dbservs:&appservs:!ftpservs' -m ping

即在webservs 或在dbservs 且在appservs但是不在ftpservs里边的

注意:虽然ansible提供了这种综合逻辑的操作,但是我们生产环境中尽量避免复杂的综合逻辑,以免给线上生产环境带来负担

正则表达式

ansbile "webservs:&dbservs" -m ping

ansible "~(web|db).*" -m ping

⚠️:要用正则表达式,必须要用波浪符号(~),下边表示的意思和第一个意思是一样的;

ansible 命令执行过程

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 退出

ansible 执行状态:

  1. 绿色:执行成功并且不需要做改变的操作
  2. 黄色:执行成功并且对目标主机做变更
  3. 红色:执行失败

ansible 使用示例

# 示例
# 以wang用户执行ping存活检测
ansible all -m ping -u wang -k

# 以wang sudo至root执行ping存活检测
ansible all -m ping -u wang -b -k

# 以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang -b -k --become-user mage

# 以wang sudo至root用户执行ls
ansible all -m command -u wang --become-user=root -a 'ls /root' -b -k -K
ansible 使用示例

ansible 常用模块

  • Command:在远程主机执行命令,默认模块,可忽略-m选项

       ansible srv -m command -a 'service vsftpd start'

   ansible srv -m command -a 'echo magedu | passwd --stdin wang'  不成功

   此命令不支持$VARNAME <>|;&等,用shell模块实现

  • Shell:和command相似,用shell执行命令

   ansbile srv -m shell -a 'echo magedu|passwd -stdin wang'

   调用bash执行命令类似cat /tmp/stanley.md | awk -F '|' '{print $1 $2}' &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回到执行命令的机器

  • Script:运行脚本

   ansible webserver -m script -a f1.sh

  • Copy:从服务器复制文件到客户端

   ansbile srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes"

   如果目标存在,默认覆盖,此处指定先备份

   ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt"利用内容,直接生成目标文件

  • Fetch:从客户端去文件至服务器端,copy相反,目录可先tar

   ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'

  • File:设置文件属性

   ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"

   ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'

  • Hostname:管理主机名

   ansible node1 -m hostname -a "name=webserv"

  • Cron:计划任务

   支持时间:minute, hour, day, month, weekday

   ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 127.0.0.1 &>/dev/null' name=Synctime" 创建任务

   ansible srv -m cron -a 'state=absent name=Synctime' 删除任务

  • Yum:管理包

   ansible srv -m yum -a 'name=httpd state=latest' 安装

   ansible srv -m yum -a 'name=httpd state=absent' 删除

   ansible srv -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm'  安装指定目录中的文件

  • Service: 服务管理

   ansible srv -m service -a "name=vsftpd state=stopped enable=false"  关闭vsftpd服务,禁止开机启动

   ansible srv -m service -a "name=httpd state=started"   开启服务

   ansible srv -m service -a "name=httpd state=reloaded"   重载服务

   ansible srv -m service -a "name=httpd state=restartd"   重新启动服务

  • User:管理用户

   ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'

   ansible srv -m user -a 'name=user1 shell=/sbin/nologin system=yes groups=root,bin uid=2048 home=/app/user1 group=root'

  • Group:组管理

   ansible srv -m group -a "name=testgroup system=yes"

   ansible srv -m group -a "name=testgroup state=absent"

ansible 命令系列

ansible-galaxy

   ansible-galaxy list

  • 安装galaxy包

   ansible-galaxy install geerlingguy.redis

  • 删除galaxy包

   ansible-galaxy remove geerlingguy.redis

ansible-pull

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

anbsible-playbook

ansible-playbook hello.yml

cat hello.yml
# hello world yml file
- hosts: webservers
  remote_user:root
  tasks:
    - name: hello world
      command:/user/bin/wall hello world

  

 ansible-vault

  • 功能:管理加密解密yml文件

    ansible-vault [create|decrypt|edit|encrypt|rekey|view]

    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 创建新文件

ansible-console:2.0+新增,可交互执行命令,支持tab

  • root@test(2)[f:10]$

    执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$

  • 设置并发数:forks n 例如:forks 10
  • 切换组:cd 主机组 例如:cd web
  • 列出当前组主机列表:list
  • 列出所有的内置命令:?或help
  • 示例:

    root@all (2)[f:5]$ list

    root@all (2)[f:5]$ cd appservs

    root@appsrvs (2)[f:5]$ list

    root@appsrvs (2)[f:5]$ yum name=httpd state=present

    root@appsrvs (2)[f:5]$ service name=httpd state=started

playbook

  • playbook是由一个火多个“play”组成的列表
  • play的主要功能在于将实现归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们联同起来按事先编排的机制同唱一台大戏
  • playbook采用yaml语言编写

yaml 介绍

  • yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括xml、c语言、python、perl以及电子邮件格式RFC2882等。clark evans在2001年在首次发表了这种语言,另外ingy dot net 与 oren ben-kiki 也是这语言的共同设计者;
  • yaml aint markup language,即yaml不是xml。不过,在开发的这种语言时,yaml的意思其实是:yet another markup language(仍是一种标记语言)
  • 特性

    yaml的可读性好

    yaml和脚本语言的交互性好

    yaml使用实现语言的数据类型

    yaml有一个一直的信息模型

    yaml易于实现

    yaml可以基于流来处理

    yaml表达能力强,扩展性好

  • 更多内容及规范参见:http://www.yaml.org

yaml 语法简介

  • 在单一档案中,可用连续三个连字号(-)区分多个档案。另外,还有选择性的连续三个点号(..) 用来表示档案结尾
  • 次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能使用#号注释代码
  • 使用#好注释代码
  • 缩进必须是统一的,不能空格和 tab 混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判別配置的级别是通过缩进结合换行来实现的
  • YAML文件内容和 Linux系统大小写判断方式保持一致,是区別大小写的,k/的值均需大小写敏感
  • k/v 的值可同行写也可换行写。同行使用:分隔 
  • v 可是个字符串,也可是另一个列表
  • 一个完整的代码块功能需最少元素需包括 name: task
  • 一个 name 只能包括一个 task
  • YAML 文件扩展名通常为 yml 或 yaml
  • List:列表,其所有元素均使用“-“打头
  • 示例
    # A list of tasty fruits
    - Apple
    - Orange
    - Strawberry
    - Mango

  • Dictionary:字典,通常由多个 key 与 value 构成

  • 示例
    ---
    # An employee recold
    name: Example Developer
    job Developer
    skill: Elite
    也可以将 key value 放置于仍中进行表示,用分隔多个 key value

  • 示例
    ---
    # An emplovee record
    [name: Example Developer, job Developer, skill: Elite)

  • YAML 的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用“-“来代表,Map 里的键值对用":"分隔
  • 示例

    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  

Playbook 核心元素

  • Hosts 行的远程主机列表
  • Tasks 任务集
  • Variables 内置变量或自定义变量在 playbook 中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签指定某条任务执行,用于选择运行 playbook 中的部分代码。ansible 具有幕等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过 tags 跳过此些代码片断

   ansible-playbook -t tagsname useradd.yml

playbook 基础组件

  • Hosts:
    • playbook 中的每个 play 的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts 用于指定要执行指定任务的主机,须事先定义在主机清单中

      可以是如下形式:
      one.example.com
      one.example.com:two.example.com
      192.168.1.50
      192.168.1. *

      Websrys:dbsrvs 两个组的并集
      Websrvs:&dbsrvs 两个组的交集
      webservers:!phoenix 在 websrvs 组,但不在 dbsrvsa 组

      例 - hosts: websrvs:dbsrvs

  • Remote_user:可用于 Host 和 task 中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务,其可用于 play 全局或某任务;此外,甚至可以在 sudo 时使用 sudo_user 指定 sudo 时切换的用户

    - hosts: websrvs
      remote_user: root
      tasks:
      - name: test connection
        ping:
        remote_user: magedu
        sudo: yes 						默认 sudo 为 ro
        sudo_user: Wang 			sudo 为 wang
  • Tasks:任务列表
    • 格式:(1) action: module arguments
               (2) module: arguments 建议使用
      注意:shel ormandy 模块后面跟命令,而非 key=value

       
    • 某任务的状态在运行后为 changed 时,可通过 "notify" 通知给相应的handlers
    • 任务可以通过“tags“打标签,而后可在 ansible-playbook 命令上使用-t指定进行调用

      示例:
      tasks:
        - name: disable selinux
          command: /sbin/setenforce 0
      

        

    • 如果命令或脚本的退出码不为零,可以使用如下方式替代

      tasks:
       - name: run this command and ignore the result
         shell: /ust/bin/sbmecommand || /bin/true
    • 或者使用 gnore_ errors 来忽略错误信息

      tasks:
       - name: run this command and ignore the result
         shell: /usr/bin/somecommand
         ignore errors: True
      

        

 

 ansible 参考链接

链接如下:

http://galaxy.ansible.com
http://galaxy.ansible.com/explore#/
http://ansible.com.cn
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples

 

posted @ 2021-09-07 18:25  Star-Hitian  阅读(69)  评论(0)    收藏  举报