美文网首页
ansible常用操作

ansible常用操作

作者: 何亮hook_8285 | 来源:发表于2023-06-17 13:30 被阅读0次

    ansible命令格式:

    ansible [匹配主机] [-i 指定hosts文件路径] -m 指定模块 -a "模块参数" [其他选项]
    其他选择 -v/-vv/-vvv  --diff --check -f -e -P -B -b|-become
    

    ansible常用命令

    #发送ping命令
    ansible all -i host -m ping
    #向远端发送一个shell命令,center表示hosts中的标识
    ansible center -i hosts -m shell -a "whoami" -become
    #比对本地的hosts和远端host差别,center表示hosts中的标识
    ansible center -i hosts -m copy-a "src=/etc/hosts dest=/etc/hosts"  --diff --check
    #向远端发送一个ping的命令,并且将返回值data改成hello,center表示hosts中的标识
    ansible center -i hosts -m ping -a "data={{hello_data}}" -e "hello_data='hello'"
    

    ansible的hosts文件内容示例

    [center]  定义组
    master 定义组内节点
    [nodes]
    ceph-[1:3] 组名称连续的值
    [nodes:vars] 定义组的变量
    ansible_ssh_user=root
    ansible_ssh_pass=123
    ansible_ssh_connection=ssh
    
    [center:vars]
    ansible_connection=local
    

    ansible常用模块

    最频繁使用 ping  shell(远程执行命令) copy(文件服务到远程) script(远程执行脚本) file(文件管理)
    常用模块 systemd(服务管理) linefile(上传内容) temlpate(模板文件)
    好用模块 cron(远程定时任务) hostname(远程给主机改名) get_url(下载一个url地址文件)
    

    ansible的playbook语法

    playbook是yml文件格式

    hosts: #ceph-1 这个杠表示数组
    gather_facts:false #不用执行setup模块,不会采集设备信息
    vars: #设置初始化变量
    test_item_vars:
    
    - "hello"
    - "hello2"
    tasks: 指定任务级
    - name: test simple for one
    debug:
        msg: "item={{item}}"一个任务ansible
    with_list:
      - "hello"
      - "world"
    

    playbook语法组成

    playbook语法-角色->(变量设置、register、判断语法、循环语句、delegate_to、等待语句)->过滤器 模块
    

    角色

    roles  角色根目录
    |-test-variable 对应角色目录
      |-defaults
        |- main.yml
      |-task
        |-main.yml
      |-vars
        |-main.yml
    角色目录说明
    defaults:存放改角色的变量
    tasks:存放task任务的yaml
    templates:存放template文件
    vars:存放变量
    handler:存放通知任务
    

    ansible文档

    https://docs.ansible.com/ansible/latest/dev_guide/sidecar.html

    ansible参考项目ceph-ansible

    执行命令

    host文件
    [webs]
    center
    sp-3
    
    [nginx]
    sp-1
    sp2
    
    [nodes1]
    sp-[1:10] #生成规则1-10  ,sp-1,sp-2
    sp-[001:200] #生成规则sp-001 sp-002
    sp-[1:10]-[1:2] #生成规则sp-1-1
    
    [nodes:vars] #分组下的变量
    ansible_ssh_port=22
    ansible_ssh_user=root
    ansible_ssh_pass=qqqqqq
    
    [webserver] 主机变量
    www.mm.com http port=80
    
    [webserver:children]  组嵌套
    nodes1
    webs
    
    [tbj]
    center
    
    [tbj:vars] #分组下所有节点变量
    ansible_connection=local
    
    ansible webs,nginx -i hosts -m shell -a "whoami"
    #查看ansible变量
    ansible sp-1,sp-2 -i hosts -m debug -a "msg={{ansible_ssh_port}}"
    
    ansible [pattern] -i hosts
    pattern 匹配执行的ansible节点 组名、主机名、all、多个组或主机
    -i hosts:指定hosts文件存在哪里
    -m 模块,默认command
    -a 模块参数 copy
    
    
    ###############执行命令###############
    #执行命令
    ansible nodes -i hosts -m shell -a "ls /root/"
    
    #执行复制命令,复制到远程机会比对文件是否更新,如果比对结果是更新则覆盖文件
    ansible nodes -i hosts -m copy -a "src=hosts dest=/root/host"
    
    #state=absent 表示放弃文件,就是删除
    ansible nodes -i hosts -m file -a "path=/root/hosts state=absent"
    
    #--diff --check 比对差异,并不会上传
    ansible nodes -i hosts -m copy -a "src=hosts desct=/root/hosts" --diff --check
    
    
    
    ###########剧本级playbook,简化重复操作###########
    - hosts: nodes #hosts文件组名称,表示这个组执行这些命令,剧本1
      gather_facts: false
      tasks:
       - name: upload hosts file
         copy:
           src: hosts
           dest: /root/hosts
       - name: run command on remote
         shell: pwd
         args:
           chdir: /tmp #命令执行目录
           creates: /root/hosts #该文件存在则不执行,removes这个命令存在执行
       - name: debug a message
         debug:
           msg: "hello"
    - hosts: center #剧本2
      gether_facts: false
      tasks:
         - name: run command on remote
           shell: hostname
    - hosts: nginx #剧本2
      gether_facts: false
      vars:
       msg: "hello
      tasks:
         - name: run command on remote
           shell: "{{msg}}---aaa"
    
    #执行playbook命令 
    ansible-playbook -i hosts test.yml
    
    #测试creates参数 该文件存在则不执行
    ansible nodes -i hosts -m shell -a "pwd creates=/root/hosts"
    #测试removes 该文件存在执行
    ansible nodes -i hosts -m shell -a "pwd removes=/root/hosts"
    #chdir 是指定pwd命令运行路径
    ansible nodes -i hosts -m shell -a "pwd removes=/root/hosts chdir=/tmp"
    
    #查看匹配的节点
    ansible nodes -i hosts --list-hosts
    #指定最大进程数 -f --fork 默认5个
    ansible nodes -i hosts -f 25
    
    ##hosts的文件内置变量
    ansible_connection=local
    ansible_ssh_port=22
    ansible_ssh_user=test
    ansible_ssh_pass=test.1234!
    ansible_sudo_pass=test.1234!
    

    变量定义和优先级(命令>hosts文件>playbook剧本文件)

    1.使用-e 传递变量
    
    ansible center -i hosts  -m shell -a "pwd" -e "msg=hello"
    
    2.使用hosts文件传递变量
    
    [all:vars]
    
    msg=hello
    
    3.剧本文件
    
    vars:
    
      msg: "hello
    
    

    roles目录结构

    image.png
    ansible roles 目录规范 - 明天OoO你好 - 博客园 (cnblogs.com)

    模块概览:

    命令和脚本模块:
    command模块,ans默认的模块,执行简单命令,不支持特殊符号;
    shell模块,执行命令,支持特殊符号;
    script模块,分发脚本并执行;
    文件模块:
    file,创建目录,文件,软链接;
    copy,远程分发文件,修改权限,所有者,备份;
    服务模块:
    systemd,服务管理;
    service,服务管理(老系统用);
    软件包管理模块:
    yum源,yum_repository,
    yum命令,
    get_url下载软件;
    系统管理模块:
    mount模块,挂载;
    cron模块,定时任务;
    用户管理模块:
    group模块,管理用户组;
    user模块,管理用户;
    用于调试模块:ping 模块检查 ,ansible与其他节点连通性。
    debug模块,用于检查/显示 变量
    其他Linux模块:压缩解压(unarchive),rsync模块(synchronize),数据库模块(mysql_db,mysql_user)...
    其他工具模块:ansible管理docker | k8s | zabbix | grafana...

    在Ansible中,编写Playbook时,支持给task定义一个或多个Tag标签,我们在执行Playbook时,可以使用-t参数,根据Tag来确定具体执行什么任务。

    ---
    - hosts: exp
      remote_user: root
      tasks:
      - name: Install Apache
        yum: name=httpd state=installed
        tags: httpd
      - name: Install Nginx
        yum: name=nginx state=installed
        tags: nginx
      - name: Stop firewalld & iptables & selinux
        shell: systemctl stop firewalld ; iptables -F ; setenforce 0
        tags:
        - httpd
        - nginx
    ansible-playbook tag.yml -t httpd
    

    二、Ansible中Handler的定义和调用
    Ansible的Playbook还支持使用Handler,所谓Handler,就是一种特殊的task,这种task总是在所有的task执行完成后再执行。Ansible中带有Handler的Playbook示例如下:

    ---
    - hosts: exp
      remote_user: root
      tasks:
      - name: Install Apache
        yum: name=httpd state=installed
      - name: Config Apache
        copy: src=httpd.conf dest=/etc/httpd/httpd.cong
        notify: Restart Apache
      - name: Stop firewalld
        shell: systemctl stop firewalld;iptables -F;setenforce 0;
      handlers:
      - name: Restart Apache
        service: name=httpd state=restarted
    
    
    vi /etc/ansible/ansible.cfg
    host_key_checking = False
    

    相关文章

      网友评论

          本文标题:ansible常用操作

          本文链接:https://www.haomeiwen.com/subject/moyoddtx.html