借用的,
https://www.cnblogs.com/chengxuyonghu/p/13763561.html
Ansible hosts文件配置IP的方式
第一种 IP+A/C
示例如下:
192.168.0.10 ansible_ssh_user=“vagrant” ansible_ssh_pass=“vagrant”
第二种 nickname+IP+A/C
testserver ansible_ssh_host=192.168.0.10 ansible_ssh_user=“vagrant” ansible_ssh_pass=“vagrant”
第三种 nickname+IP+Account+节点私有key
testserver ansible_ssh_host=192.168.0.10 ansible_ssh_user=“vagrant” ansible_private_key_file=./vagrant/machines/default/virtual/private_key
第四种 IP
192.168.0.10
注:这种方式需要先用ssh-keygen命令(回车三次)生成管理主机的public key
然后把key用命令ssh-copy-id -i 发送到节点主机上去才能起作用。
示例:
ssh-copy-id -i “/home/vagrant/.ssh/id_rsa.pub” [email protected]
1、正常写法,name1为别名:
[test1]
name1 ansible_ssh_host=192.168.1.111 ansible_ssh_user="root" ansible_ssh_pass="1234" ansible_ssh_port=22
name2 ansible_ssh_host=192.168.1.222 ansible_ssh_user="root" ansible_ssh_pass="1234" ansible_ssh_port=22
2、连续的IP写法,表示192.168.1.20到192.168.1.50,共31台主机:
[test1]
name1 ansible_ssh_host=192.168.1.[20:50] ansible_ssh_user="root" ansible_ssh_pass="1234" ansible_ssh_port=22
3、带参数的群组,vars底下为群组共同便变量,包括已定义变量和自定义变量:
[test1]
name1 ansible_ssh_host=192.168.1.[20:50]
[test1:vars]
ansible_ssh_user=root
ansible_ssh_pass="1234"
testvar="test"
4、群组整合,children底下为父群组test的子群组,调用方式为ansible test -m ping:
[dbtest]
name1 ansible_ssh_host=192.168.1.[20:50] ansible_ssh_user="root" ansible_ssh_pass="1234" ansible_ssh_port=22
[webtest]
name2 ansible_ssh_host=192.168.2.[20:50] ansible_ssh_user="root" ansible_ssh_pass="1234" ansible_ssh_port=22
[test:children]
dbtest
webtest
5、调用两个主机组的写法,以下webservers和dbservers都会被调用:
ansible webservers:dbservers -m ping
6、在webservers组中但不在dbsersers中的调用:
ansible webservers:!dbservers -m win_ping
7、在webservers组中并且在dbservers组中的才会调用:
ansible webservers:&dbservers -m ping
8、在调用前加~,代表正则表达式:
ansible ~(web|db).*.91it.org -m win_ping
9、组合的例子:
webserver:dbservers:&nginx:!ntp
10、hosts文件中没有定义的IP或别名,在进行调用中,会提示错误。ansible对单台服务器的调用,服务器IP或域名必须有写在hosts里。
11、ansible配置文件
在配置文件里面配置用户和端口,就可以不要在host里面配置指定里
ansible 有许多参数,下面我们列出一些常见的参数:
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户
remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
Ansible执行命令过程:
- 加载自己的配置文件 默认/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
- $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,sleep 0退出
Ansible命令工具:
- ansible主程序,临时命令执行工具
- ansible-doc 查看配置文档,模块功能查看工具
- ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
- ansible-playbook 定制自动化任务,编排剧本工具
- ansible-pull 远程执行命令的工具
- ansible-vault 文件加密工具
- ansible-console 基于Console界面与用户交互的执行工具
Ansible常用模块:
ansible 默认提供了很多模块来供我们使用。
在 Linux 中,我们可以
通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块,
通过 ansible-doc -s 模块名 又可以查看该模块有哪些参数可以使用。
为了更好规范定义的主机与组变量,
Ansible支持 将/etc/ansible/hosts定义的主机名与组变量单独剥离出来存放到指定的文件中,将采用YAML格式存放,
存放位置规定:“/etc/ansible/group_vars/+组名”和“/etc/ansible/host_vars/+主机名”分别存放指定组名或主机名定义的变量。
ping 模块 yum 模块 copy 模块 file 模块 service 模块 user 模块 group模块 cron 模块 template 模块 setup 模块 fetch 模块 apt 模块 command 模块 shell 模块 script 模块
yum 安装包模块
yum安装vsftpd包:(默认state=installd) ansible all -m yum -a 'name=vsftpd' 安装多个包用逗号隔开: ansible all -m yum -a 'name=vsftpd,httpd' 显示所有已安装的包: ansible all -m yum -a 'name=vsftpd list=installd' 卸载vsftpd包: ansible all -m yum -a 'name=vsftpd state=removed' 安装从互联网下载的包: ansible srv -m copy -a 'src=/root/package.rpm dest=/data/package' ansible srv -m yum -a 'name=/data/package.rpm' 更新缓存: ansible srv -m yum -a 'update_cache=yes' 更新缓存同时安装dstat包 ansible srv -m yum -a 'name=dstat update_cache=yes'参数详解:
- config_file:yum的配置文件 (optional)
- disable_gpg_check:关闭gpg_check (optional)
- disablerepo:不启用某个源 (optional)
- enablerepo:启用某个源(optional)
- name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
- state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
copy 复制文件模块
ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh mode=600 backup=yes" 如目标存在,默认覆盖,此处指定先备份 ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt" 利用内容,直接生成目标文件参数详解:
- update_cache: 更新缓存
- name: 要创建的文件名字
- state: 状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
- mode: 目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx 或 u = rw,g = r,o = r)
- backup: 如果原目标文件存在,则先备份目标文件
- force: 是否强制覆盖,默认为yes
- owner: 目标文件属主
- group: 目标文件属组
file 文件操作模块
创建新文件: ansible all -m file -a 'name=/data/f3 state=touch'
删除文件: ansible all -m file -a 'name=/data/f3 state=absent'
创建目录: ansible all -m file -a 'name=/data/dir1 state=directory'
删除目录: ansible all -m file -a 'name=/data/dir1 state=absent'
创建软连接: ansible all -m file -a 'src=/etc/fstab dest /data/fstab.link state=link'
删除软连接: ansible all -m file -a 'dest /data/fstab.link state=absent'
创建文件指定所有者,权限: 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'
参数详解:
- force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
- group:定义文件/目录的属组
- mode:定义文件/目录的权限
- owner:定义文件/目录的属主
- path:必选项,定义文件/目录的路径
- recurse:递归的设置文件的属性,只对目录有效
- src:要被链接的源文件的路径,只应用于state=link的情况
- dest:被链接到的路径,只应用于state=link的情况
- state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
service 管理服务模块
![复制代码](https://common.cnblogs.com/images/copycode.gif)
![复制代码](https://common.cnblogs.com/images/copycode.gif)
参数详解:
- arguments:给命令行提供一些选项
- enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。
- name:必选项,服务名称
- runlevel:运行级别
- sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
- state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
user 管理用户模块
添加用户,指定uid、家目录、主组及注释: ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
添加一个系统用户: ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
删除用户: ansible srv -m user -a 'name=user1 state=absent'
添加一个nginx用户: ansible srv -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service"
删除nginx用户,同时删除家目录: ansible srv -m user -a 'name=nginx state=absent remove=yes'
参数详解:
- home:指定用户的家目录,需要与createhome配合使用。
- groups:指定用户的属组。
- uid:指定用的uid。
- password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
- name:指定用户名。
- createhome:是否创建家目录 yes|no。
- system:是否为系统用户。
- remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
- state:是创建还是删除。(present,absent)
- shell:指定用户的shell环境。
- generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
- ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
- ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
- ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
- ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
group管理组模块
创建一个系统组: ansible srv -m group -a "name=testgroup system=yes"
删除一个组: ansible srv -m group -a "name=testgroup state=absent"
创建nginx组: ansible srv -m group -a 'name=nginx system=yes gid=80'
删除nginx组: ansible srv -m group -a 'name=nginx state=absent'
参数详解:
- gid:指定用的gid。
- name:指定用户名。
- state:是创建还是删除。(present,absent)
- system:如果是,则表示创建的组是系统组。
cron 计划任务模块
支持时间:minute,hour,day,month,weekday
创建计划任务:每周1,3,5,每分钟打印,任务名称:warningcron ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron'
注释cronname=waringcron的计划任务: ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
给cronname=waringcron的计划任务去掉注释: ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
创建计划任务:每五分钟同步一次服务器时间,任务名称:syntime ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime"
删除计划任务:Synctime ansible srv -m cron -a 'state=absent name=Synctime'
template模块
基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)
参数详解:
- backup: 如果原目标文件存在,则先备份目标文件
- src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。
- dest:将模板渲染到远程机器上的位置。
- force:是否强制覆盖,默认为yes
- owner:目标文件属主
- group:目标文件属组
- mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。
setup模块
收集指定服务器的信息,每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本、IP地址等报告给远程的ansbile主机。在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下:
ansible all -m setup -a "filter=ansible_os_family"
这里给出filter常用可选项:
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本
fetch 从客户端取文件至服务器端
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'
例: 打包 /var/log 下所有日志文件并远程抓取
ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'
ansible all -m fetch -a 'src=/root/log.tar.xz dest=/data'
常用参数:
- src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。
-dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。
- flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为。
apt安装包模块
# 在安装foo软件包前更新然后安装foo - apt: name=foo update_cache=yes
# 移除foo软件包 - apt: name=foo state=absent
# 安装foo软件包 - apt: name=foo state=present
# 安装foo 1.0软件包 - apt: name=foo=1.00 state=present
# 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新 - apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes
# 只下载openjdk-6-jdk最新的软件包,不安装 - apt: name=openjdk-6-jdk state=latest install_recommends=no
# 安装所有软件包到最新版本 - apt: upgrade=dist
# 更新apt-get的list - apt: update_cache=yes
# 3600秒后停止update_cache - apt: update_cache=yes cache_valid_time=3600
# 安装远程节点上的/tmp/mypackage.deb软件包 - apt: deb=/tmp/mypackage.deb
参数详解:
- deb: 用于安装远程机器上的.deb后缀的软件包(optional)
- install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
- update_cache: 当这个参数为yes的时候等于apt-get update(optional)
- name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
- state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
command模块
command 模块可以帮助我们在远程主机上执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a 'service vsftpd start'
注意:
- 使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理。
- 在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如 "<" , ">", "|", ";" 和 "&"这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。
- 如果远程节点是 windows 操作系统,则需要使用 win_command 模块
shell模块
ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 处理。
使用 shell 模块可以在远程服务器上执行命令,它支持管道与重定向等符号
script模块
script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。
Ansible可以执行命令的模块有三个:
command
shell
raw
应尽量避免使用这三个模块来执行命令,因为其他模块大部分都是幂等性的,可以自动进行更改跟踪。command、shell、raw不具备幂等性。
command、shell模块:
要求受管主机上安装Python。command可以在受管主机上执行shell命令,但是不支持环境变量和操作符(例如 '|', '<', '>', '&'),shell模块调用的/bin/sh指令执行。
raw模块:
不需要受管主机上安装Python,直接使用远程shell运行命令,通常用于无法安装Python的系统(例如网络设备等)。
一些简单的playbook:
1.安装apache服务
![复制代码](https://common.cnblogs.com/images/copycode.gif)
- hosts: ubuntu sudo: yes tasks: - name: 安装apache 服务 apt: pkg=apache2 state=installed - name: 推送默认的配置 copy: src=files/awesome-app dest=/etc/apache2/sites-available/awesome-app mode=0640 - name: 创建文档根目录 file: dest=/var/www/awesome-app state=directory - name: 移除默认的虚拟主机 file: dest=/etc/apache2/sites-available/000-default.conf state=absent notify: - restart apache handlers: - name: restart apache service: name=apache2 state=restarted
![复制代码](https://common.cnblogs.com/images/copycode.gif)
ansible-playbook config.yml -K
2.安装nginx服务
![复制代码](https://common.cnblogs.com/images/copycode.gif)
- hosts: ubuntu #这个是你选择的主机 #这个是变量 vars: work_user: www-data worker_processes: 2 #sudo方式运行 sudo: yes tasks: #利用apt模块来操作 - name: ensure nginx is installed apt: pkg=nginx state=installed - name: write the nginx config file template: src=templates/nginx.j2 dest=/etc/nginx/nginx.conf #触发重启服务器 notify: - restart nginx - name: ensure nginx is running service: name=nginx state=started #这里的restart nginx 和上面的触发是配对的。这就是handlers的作用。 handlers: - name: restart nginx service: name=nginx state=restarted
![复制代码](https://common.cnblogs.com/images/copycode.gif)
![复制代码](https://common.cnblogs.com/images/copycode.gif)
- hosts: ubuntu sudo: yes vars: epic: true tasks: - name: 如果是ubuntu shell: 'touch /tmp/ubuntu.txt' when: ansible_os_family == 'Debian' - name: 输出 shell: echo "aaa" > /tmp/aaa.txt when: epic - name: 安装ntp 在debian上 apt: name=ntp state=installed when: ansible_os_family == 'Debian' - name: 安装ntp 在RedHat上 yum: name=ntp state=installed when: ansible_os_family == 'RedHat'标签:name,样式,state,nginx,host,ansible,ssh,模块 From: https://www.cnblogs.com/nnxl/p/17754607.html