安装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‘