Ansible学习笔记03

Ansible 系列命令

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-vault encrypt hello.yml # 加密
image.png
ansible-vault decrypt hello.yml # 解密
image.png

Ansible-console

  • 可交互执行命令,支持tab
root@test (2)[f:10] $
执行用户@当前操作的主机组(当前组的主机数量)f:并发数]$

设置并发数: forksn 例如: forks 10
切换组: cd主机组 例如: cd web
列出当前组主机列表: list
列出当前组主机列表: list
  • 示例
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
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
image.png

Ansible-galaxy

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

Ansible PlayBook

  • 使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,可以利用Ansible PlayBook编写剧本,从而以更加简单的方式实现任务处理的自动化与流程化
  • PlayBook是一个或多个"play"组成的列表,play的主要功能是为Ansible中的task定义好的角色,指定剧本对应的服务器
  • task是一个任务,task调用Ansible各种模块module,将多个play组织在一个PlayBook剧本中,然后组成一个非常完整的流程控制集合
  • 基于Ansible PlayBook还可以收集命令、创建任务集,这样能够大大降低管理工作的复杂程度,PlayBook采用YAML语法结构,易于阅读,方便配置
image.png
  • YAML(yet another markup language)是一种直观的能被电脑识别的数据序列化格式,是一个容易阅读容易和脚本语言交互,用来表达资料序列的编程语言
  • YAML语法
    • 在单一档案中,可用连续三个连字号(一)区分多个档案。 另外,还有选择性的连续三个点号
    • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
    • 使用#号注释代码
    • 缩进必须是统-的 ,不能空格和tab混用
    • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结
    • YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
    • k/v的值可同行写也可换行写。同行使用:分隔
    • v可是个字符串,也可是另一个列表
    • 一个完整的代码块功能需最少元素需包括name: task
    • 一个name只能包括一个task
    • YAML文件扩展名通常为yml或yaml
  • YAML使用空白字符和分行来分隔资料,适合用grep、Python、Perl、Ruby操作
    1. YAML的语言特性
      • 可读性强
      • 和脚本语言的交互性好
      • 使用实现语言的数据类型
      • 一致的信息模型
      • 易于实现
      • 可以基于流来处理
      • 可扩展性强
    2. PlayBooks组件内容
      • target:定义PlayBook的远程主机组
      • variable:定义PlayBook使用的变量
      • task:定义远程主机上执行的任务列表
        • play的主体部分是task list.task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个.在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
        • task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
        • 每个task都应该有其name ,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
        • 某任务的状态在运行后为changed时,可通过"notify" 通知给相应的handlers
        • 任务可以通过"tags "打标签,而后可在ansible- -playbook命令上使用-t指定进行调用
      • handler:定义task执行完成以后需要调用的任务,例如配置文件被改动,则启动handler任务重启相关联的服务
    3. target常用参数
      • hosts:定义远程主机组
        • Websrvs:dbsrvs 两个组的并集
        • Websrvs:&dbsrvs 两个组的交集
        • webservers:!phoenix 在websrvs组,但不在dbsrvs组
      • remote_user:执行该任务的用户
      • sudo:设置为yes的时候,执行任务使用root权限
      • sudo_user:指定sudo普通用户
      • connection:默认基于SSH连接客户端
      • gather_facks:获取远程主机facts基础信息
    4. variable常用参数
      • vars:定义格式,变量名:变量值
      • vars_files:指定变量文件
      • vars_prompt:用户交互模式自定义变量
      • setup:模块取远程主机的值
    5. task常用参数
      • name:任务显示名称即屏幕显示信息
      • action:定义执行的动作
      • copy:复制本地文件到远程主机
      • template:复制本地文件到远程主机,可以引用本地变量
      • service:定义服务的状态
    6. template模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    7. Handlers和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
      • handlers和notify结合使用触发条件:
        • 是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
        • Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生在notify中列出的操作称为handler ,也即notify中调用handler中定义的操作在notify中列出的操作称为handler ,也即notify中调用handler中定义的操作
    8. tags标签指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断.例:ansible-playbook -t tagsname useradd.yml

PlayBook变量

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

  • 变量来源:

    1. ansible setup facts远程主机的所有变量都可直接调用

      • setup: 查看被管理管理主机信息的键值对 , 可以引用setup模块的变量
      • ansible -m setup 10.0.0.203
    2. 在/etc/ansible/hosts中定义

      • 普通变量:主机组中主机单独定义,优先级高于公共变量
      • 公共(组)变量:针对主机组中所有主机定义统一变量
    3. 通过命令行指定变量,优先级最高

      • ansible-playbook -e varname=value
    4. 在playbook中定义

      vars:
        - var1: value1
        - var2: value2
      
    5. 在role中定义

ansible 10.0.0.203 -m hostname -a "name=node10.0.0.203" # 修改的值就在setup中
image.png
image.png

PlayBook常见选项

  • --check 只检测可能会发生的改变,但不真正执行操作
  • --list-hosts 列出运行任务的主机
  • --limit 主机列表只针对主机列表中的主机执行
  • -V 显示过程-VV -VVV 更详细
  • --list-tags 列出运行任务的标签
image.png

PlayBook的使用

  • 案例一:简单使用

    • 创建并编辑hosts.yml文件
    ---
    - hosts: web
      remote_user: root
      tasks:
        - name: create new file
          file: name=/data/newfile state=touch
        - name: create new user
          user: name=test111 shell=/sbin/nologin
        - name: install package
          yum: name=httpd
        - name: copy file
          copy: src=/var/www/html/index.html
        - name: start service
          service: name=httpd state=started enabled=yes
    
    • ansible-playbook -C hosts . yml # 预执行playbook
image.png
  • ansible-playbook hosts . yml # 正常执行playbook
image.png
  • 案例二:使用相对路径

    ---
    - hosts: websrvs
      remote_ user: root
      tasks:
      - name: Install httpd
        yum: name=httpd state= present
      - name: Install configure file
        copy: src=files/httpd.conf dest=/etc/httpd/conf/
      - name: start service
        service: name=httpd state= started enabled=yes
    
    # files的相对路径为家目录下的ansible/files
    
  • 案例三:handler与notify触发条件

    • 本地下载httpd包,yum install httpd -y
    • 当修改本地配置文件后再次运行ansible-playbook httpd.yml,notify会监控本地/etc/httpd/conf/httpd.conf有没有发生变化,如果有变化则通知handlers来触发它里面的task
    ---
    - hosts: web
      remote_user: root
    
      tasks:
        - name: install httpd package
          yum: name=httpd
        - name: copy conf file
          copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart service
        - name: start service
          service: name=httpd state=started enabled=yes
    
      handlers:
        - name: restart service
          service: name=httpd state=restarted
    
  • 案例四:tags的使用

    ---
    - hosts: web
      remote_user: root
    
      tasks:
        - name: install httpd package
          yum: name=httpd
          tags: inshttpd
        - name: copy conf file
          copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart service
        - name: start service
          service: name=httpd state=started enabled=yes
          tags: rshttpd
    
      handlers:
        - name: restart service
          service: name=httpd state=restarted
    
    • ansible-playbook -t rshttpd httpd.yml # -t参数指定运行带有rshttpd标签的task
  • 案例五:案例四: 多个动作公用一个tags

    ---
    - hosts: web
      remote_user: root
    
      tasks:
        - name: install httpd package
          yum: name=httpd
          tags: httpd
        - name: copy conf file
          copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart service
        - name: start service
          service: name=httpd state=started enabled=yes
          tags: httpd
    
      handlers:
        - name: restart service
          service: name=httpd state=restarted
    
    • ansible-playbook -t httpd httpd.yml # 带有httpd标签的task都会执行
  • 案例六:变量的使用

    • 在命令行中使用变量(优先级最高)
    ---
    - hosts: web
      remote_user: root
    
      tasks:
        - name: install  package
          yum: name={{ pak_name1 }}
        - name: start service
          service: name={{ pak_name2 }}
    
    ansible-playbook -e 'pak_name1=tree pak_name2=sl'   qqq.yml # -e参数指定变量
    
    • 在/etc/ansible/hosts中定义普通变量
    [web]
    10.0.0.203 http_port=80
    10.0.0.204 http_port=81
    
    ---
    - hosts: web
      remote_user: root
    
      tasks:
        - name: set hostname
          hostname: name=www{{http_port}}
    
    • 在/etc/ansible/hosts中定义公共(组)变量
    [web]
    10.0.0.203 http_port=80
    10.0.0.204 http_port=81
    10.0.0.204
    [web:vars]
    http_port=82
    
    # 10.0.0.204默认使用组变量,优先级比普通变量低
    
    ---
    - hosts: web
      remote_user: root
    
      tasks:
        - name: set hostname
          hostname: name=www{{http_port}}
    

你可能感兴趣的:(Ansible学习笔记03)