ansible的使用

安装ansible
    管理端
        yum install -y ansible
    被管理端
        不需要安装任何软件,管理端通过ssh登录管理
        
ansible的配置文件
    使用yum安装的ansible默认生成的配置文件为
        /etc/ansible/ansible.cfg
        /etc/ansible/hosts
    配置文件生效顺序
        1.环境变量 ANSIBLE_CONFIG
        2.当前目录下的 ansible.cfg
        3.家目录中的 .ansible.cfg
        4./etc/ansible/ansible.cfg
        会使用第一个找到的配置,找到之后就不会找其他的了
    日志问题:
        ansible对于远程机器的操作会被记录到远程机器的日志中,可以在ansible.cfg启用“no_log: True”避免
        
设置被管理的主机和组
    /etc/ansible/hosts:没写在这个文件中的主机是不能用ansible管理的
        不分组服务器:
            192.168.10.52
        分组:一台服务器可以同时属于多个组
            [group]
            192.168.10.52 192.168.10.53    
            
            简写模式
                如果服务器的域名有明显的规律,可以使用类似www[1:10].xxx.xxx的方式www[a:f].xxx.xxx
                
        特殊写法
            可以为每一个主机设置连接类型和用户名密码
                主机 ansible_connection=ssh ansible_ssh_user=mpdehaan ansible_ssh_pass=jack
            给主机设置变量
                主机 xxx=xxx
            给组设置变量
                [组名:vars]
                xxx=xxx
            组之间的包含(表示这个组中包含写的两个组)
                [组名:children]
                组名1
                组名2
            使用文件定义变量
                /etc/ansible/group_vars/组名1
                /etc/ansible/group_vars/组名2
                /etc/ansible/host_vars/主机名
                                
使anbible能够访问被管理的服务器
    1.在/etc/ansible/hosts中写明账号密码
        192.168.12.51 ansible_ssh_user=root ansible_ssh_pass=123456987 name=master
    2.使用秘钥认证方式
        生成一个key
            ssh-keygen -t rsa -C '注释信息' #都使用默认的配置,公钥和私钥都保存在 ~/.ssh中
        复制秘钥到被管理的服务器
            ssh-copy-id 用户@远程服务器 #如果想要控制本机的话,自己也要复制一次
    注意:
        1.新机器known_hosts提示问题
            在/etc/ansible/ansible.cfg中启用 #host_key_checking = False
        2.有多个秘钥问题
            在主机后面使用ansible_ssh_private_key_file 指定秘钥文件
            使用ssh-agent
            
    ssh-agent
        ssh-agent是用来管理秘钥的一个工具,可以实现连接不同主机使用不同的秘钥以及自动输入秘钥的密码等
        1.向ssh-agent中添加秘钥
            ssh-add ~./ssh/id_dsa
            ssh-add:能够把专用秘钥添加到ssh-agent的缓存中
        2.从ssh-agent中删除秘钥
            ssh-add -d ./ssh/id_xxx.pub
        3.查看ssh-agent中的秘钥
            ssh-add -l
        启动ssh-agent
            ssh-agent        

查看ansible文档
    ansible-doc -l 列出所有的模块
    ansible-doc -s 模块名 显示简略的帮助信息
    ansible-doc 模块名 显示详细的帮助信息        

ansible命令格式
    ansible 主机 -m 模块 -a '参数' [-f n]
        主机:all,*,ip,主机名,组名
            如果有多个用:分隔
            组名1:!组名2:在组1中但不能包含在组2中
            组名1:&组名2:必须同时在组1和组2中
        -m:默认使用command模块
            command模块不支持echo,不支持管道,变量等,如果有需要可以使用shell模块
        -f:指定使用几个并行的进程
    ansible all -m command -a 'date'
    ansible all -a 'date'

ansible的一些常用模块
    shell
        与默认的command相比能够使用变量,变量
    copy:复制文件
        src=
        dest=
        mode=nnn
        owner=
        group=
        ansible 47.52.128.79 -m copy -a "src=leke.sh dest=/home/rjjy/"
    file:创建目录,设置文件属性,创建软链接
        dest=
        mode=
        owner=
        group=
        state=directory
        ansible 47.52.128.79 -m file -a "dest=/home/rjjy/aa state=directory"
    yum:安装软件
        name=软件名臣
        state=present(安装)|absent(卸载)
    user:管理用户
        name=用户名
        password:密码
        state=absent
        ansible all -u root -m user -a 'name=test state=present'
        ansible all -u root -m user -a 'name=test state=absent'
    service:启动服务
        name=服务名
        state=started|restarted|stopped
        enabled=true|false 是否开机自动启动
    script:运行脚本
        将管理主机的脚本复制到每一个被管理主机上运行,默认复制到用户的家目录下
        ansible 47.52.128.79 -m script -u root -a 'test.sh'
        注意:这里的脚本要用相对路径,因为ansible是将脚本复制到远程主机上执行的,在远程主机上的路径不一定和本地主机一致
    ping:测试被管理主机的连接
        ansible 47.52.128.79 -m ping
    setup:收集信息
        可以实现给不同的主机设置不同的配置文件
    template:
        这个模块的作用其实也是复制文件,和copy的不同之处在于这个文件里面可以写变量,复制过去之后就替换了
        如果用copy的话不能替换变量

playbook:如果对服务器需要进行多项操作,可以写成一个playbook进行运行
    格式
        - hosts:主机或组
         remote_user: 执行命令的用户
         tasks:
         - name: 任务名称随便起
            remote_user: 每一个task都能自己定义
            模块名: 参数
                如果太长可以分行,下一行要比上一行多一个缩进
            sudo:yes 是否使用sudo
            sudo_user sodu的用户
            when:条件
                该tasks只有在条件满足的时候才会执行,这里的变量名不用加 {{}}
        playbook的变量
            整个playbook的变量
                - hosts :
                 vars:
                    xxx: xxx
                    xxx: xxx
                调用变量
                    {{ 变量名 }}
                        
            每个task设置自己的变量                            
                将变量名用{{ item }}替换,然后再后面增加
                with_items:
                - item1
                - item2
                就相当于让item循环items里面的元素
            
                如果有多个元素要循环
                将变量名用{{ item.xxx }}和{{ item.yyy }}替换
                with_items:
                - {xxx:,yyy:}
                - {xxx:,yyy:}    
                
        示例:
            - hosts: all
             tasks:
             - name: install httpd
                yum: name={{ item }} state=installed
                with_items:
                - httpd
                - telnet
             - name: start
                service: name=nagin state=started
        触发器:
            如果task没改变,那么task中的任务就不会执行,就不会触发notify,如果列表中有的改变有的没改变,那么只有改变的会触发
            - hosts: all
             tasks:
             - template: src=b.pdf dest=/home/rjjy/iccc
                notify:
                - restart httpd
             handlers:
             - name: restart httpd
                service: name=nginx state=restarted    
            
    playbook的执行
        检测playbook的语法
            ansible-playbook --syntax-check /path/to/playbook.yaml
        测试运行playbook
            ansible-playbook -C /path/to/playbook.yaml
        查看playbook影响的机器
            ansible-playbook test.yaml --list-hosts
        运行
            ansible-playbook /path/to/playbook.yaml
        只运行部分task
            tags:能够给一个task加标签,这样跑playbook的时候可以指定只运行某个tags的,多个任务可以写一个tags
            tags : wwww
            ansible-playbook c.yml --tags='wwww'    
            
aisible的执行特点
    幂等性:ansible的模块能够保证幂等性,即多次执行结果也是一致的(如果使用的command,shell等调用命令就要自己保证了)
    执行顺序:逐个task执行的,一个task在所有的主机上都执行完成后才会执行下一个task
    执行失败:如果playbook中某些任务执行失败(对shell来说是返回值不为0),所有已经执行的任务可能都会回滚(如果可以回滚)
        解决方案
            1.这时候可以使用 shell:命令||/bin/true 将返回码强行转换为成功的0
            2.在tasks里面增加一个 ignore_errors:True 忽略失败
                tasks:
                - name
                 ignore_errors


role:
    role的意义就在于将hosts和其他的分离出来
    role应该包含的文件
        tasks:应该至少包含一个main.yml,只写tasks,里面调用的模板,文件什么的直接写名称就行
        files:应该包含由copy或者script调用的目录
        templates:应该包含模板文件
        handlers:应该包含一个main.yml
        vars:应该包含一个main.yml文件,用到的变量,写在这的直接用就行
        meta:应该包含一个main.yml文件,用于定义用到的变量和依赖关系
        default:应该包含一个main.yml文件,为角色设置默认变量的时候使用
    role的目录结构
        .
        └── roles
            └── testrole
                ├── default
                ├── files
                ├── handlers
                ├── meta
                ├── tasks
                ├── templates
                ├── vars
                └── yml
    role的调用
        一般应该在和role目录同级的目录中创建一个site.yml文件
        调用方式为
            - hosts:
             remote_user:
             roles:
             - role1:
             role2:
    role示例:
        ├── roles
        │   ├── test1
        │   │   ├── files
        │   │   │   └── testfile
        │   │   ├── handlers
        │   │   ├── meta
        │   │   ├── tasks
        │   │   │   └── main.yml
        │   │   ├── templates
        │   │   └── vars
        │   └── test2
        │   ├── files
        │   │   └── testfile
        │   ├── tasks
        │   │   └── main.yml
        │   └── vars
        ├── site.yml
        
    site.yml
        - hosts: 47.52.128.79
         remote_user: rjjy
         roles:
         - test2
        - hosts: 47.52.128.79
         remote_user: rjjy
         roles:
         - test1
     vim roles/test1/tasks/main.yml
         - name: copy
         copy: src=testfile dest=/home/rjjy/
         - name: ddd
         shell: wall 'meile'

上一篇:透过 CSS 模式设定建立弹性的网页界面


下一篇:安装_解决”此主机 Intel VT-x, 但Intel VT- x处于禁用状态“问题