ansible部署
定义清单 清单定义Ansible将要管理的一批主机 这些主机也可以分配到组中,以进行集中管理;组可以包含子组,主机也可以是多个组的成员 清单还可以设置应用到它所定义的主机和组的变量 通过两种方式定义主机清单: 静态主机清单可以通过文本文件定义 动态主机清单可以根据需要使用外部信息提供程序通过脚本或其他程序来生成
使用静态清单指定 静态清单文件是指定Ansible目标受管主机的文本文件。可以使用多种不同的格式编写此文件,包括INI样式或YAML(ansible使用的是YAML语言) INI样式的静态清单文件是受管主机的主机名或IP地址的列表
[root@lyy ~]# cd /etc/ansible/
[root@lyy ansible]# vim hosts
..........
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
..........
可以将受管主机组织为主机组,通过主机组,可以更加有效的对一系列系统运行Ansible;每一部分的开头为以中括号括起来的主机组名称。其后为该组中每一受管主机的主机名或IP地址,每行一个
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www[001:006].example.com //(指的是www1.example.com到www6.example.com;共六个受管主机)
[dbservers]
//(空格也包含在dbservers组内)
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
db-[99:101]-node.example.com
验证清单内容 可使用ansible命令验证受管主机是否存在于清单中
//指定受管主机的主机名或IP地址
[root@lyy ~]# ansible 192.168.1.100 --list-hosts
hosts (1):
192.168.1.100
[root@lyy ~]# ansible beta.example.org --list-hosts
hosts (1):
beta.example.org
//指定主机组名称查看所有的受管主机
[root@lyy ~]# ansible webservers --list-hosts
hosts (4):
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
[root@lyy ~]# ansible dbservers --list-hosts
hosts (4):
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
如果清单中含有名称相同的主机和主机组,ansible 命令将显示警告并以主机作为其目标,主机组则被忽略;所以要确保主机组不使用与清单中主机相同的名称
配置文件的位置
ansible配置文件查找顺序 ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下: 1.检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg); 2.~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件; 3./etc/ansible.cfg检查etc目录的配置文件
配置文件的优先级 ANSIBLE_CONFIG > ./ansible.cfg > ~/ansible.cfg > /etc/ansible/ansible.cfg 使用 ansible --version 查看当前Ansible版本正在使用的配置文件
[root@lyy ~]# ansible --version
ansible 2.9.11
config file = /etc/ansible/ansible.cfg //当前使用的配置文件
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Oct 11 2019, 15:04:54) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)]
//下载复制配置文件到该/root目录下
[root@lyy ~]# cp -a /etc/ansible/ansible.cfg /root
[root@lyy ~]# ls
anaconda-ks.cfg ansible.cfg
[root@lyy ~]# ansible --version
ansible 2.9.11
config file = /root/ansible.cfg //配合文件的路径该为当前文件下的ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Oct 11 2019, 15:04:54) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)]
怎样查看帮助文档 man page man是manual(操作手册)的简写,使用方式: man [指令] man date 在显示的内容中查找内容: / + 搜索你的关键字
上下左右键来查看更多说明,按q退出
man -f man(查找man完整名称的手册) man -k man(模糊查询含有man名称的手册)
whatis [命令或数据] <==相当于 man -f [命令或数据] apropos [命令或数据] <==相当于 man -k [命令或数据] 上面的这两个命令要使用用,需要root创建whatis数据库才行: makewhatis
Ansible常用模块 ping 模块: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 。 raw 模块: 执行原始的命令,而不是通过模块子系统。 yum 模块: RedHat和CentOS的软件包安装和管理工具。 apt 模块: Ubuntu/Debian的软件包安装和管理工具。 pip 模块 : 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements。 synchronize 模块: 使用rsync同步文件,将主控方目录推送到指定节点的目录下。 template 模块: 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。 copy 模块: 在远程主机执行复制操作文件。 user 模块 与 group 模块: user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。 service 模块: 用于管理远程主机的服务。 get_url 模块: 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)。 fetch 模块: 它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。 file 模块: 主要用于远程主机上的文件操作。 lineinfile 模块: 远程主机上的文件编辑模块 unarchive模块: 用于解压文件。 command模块 和 shell模块: 用于在各被管理节点运行指定的命令. shell和command的区别:shell模块可以特殊字符,而command是不支持 hostname模块: 修改远程主机名的模块。 script模块: 在远程主机上执行主控端的脚本,相当于scp+shell组合。 stat模块: 获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息。 cron模块: 远程主机crontab配置。 mount模块: 挂载文件系统。 find模块: 帮助在被管理主机中查找符合条件的文件,就像 find 命令一样。 selinux模块:远程管理受控节点的selinux的模块
模块的使用
ping模块 检查指定节点机器是否还能连通,用法很简单,不涉及参数. 主机如果在线,则回复pong. 测试连通性的模块
[root@ansible-server ansible]# ansible web-nodes -m ping
172.16.50.67 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.50.66 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.50.65 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@ansible-server ansible]# ansible -i /etc/ansible/hosts all -m ping
172.16.50.67 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.50.66 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.50.65 | SUCCESS => {
"changed": false,
"ping": "pong"
}
可以获得该模块的说明
[root@ansible-server ~]# ansible-doc -v ping
yum模块 这个模块是RedHat 和 CentOS作为远端受控节点OS的时候,用的最多的模块, 是RedHat / CentOS包管理工具的模块, 使用`yum’软件包管理器管理软件包,其选项有: config_file:yum的配置文件 (optional) disable_gpg_check:关闭gpg_check (optional) disablerepo:不启用某个源 (optional) enablerepo:启用某个源(optional) name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径 state:表示是安装还是卸载的状态, 其中present、installed、latest 表示安装, absent 、removed表示卸载删除; present默认状态, laster表示安装最新版本
温馨提示: 要确保受控节点的python版本对应正确, 否则执行下面命令会报错 (下面报错说明受控节点需要python2版本, 而当前是python3): “msg”: “The Python 2 bindings for rpm are needed for this module. If you require Python 3 support use the dnf Ansible module instead… The Python 2 yum module is needed for this module. If you require Python 3 support use the dnf Ansible module instead.”
安装httpd
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name=httpd state=latest'
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name=httpd state=present'
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name=httpd state=installed'
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name="@Development tools" state=present'
卸载httpd
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name=httpd state=absent'
[root@ansible-server ~]# ansible web-nodes -m yum -a 'name=httpd state=removed'
user 模块与group 模块 user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
user模块 home: 指定用户的家目录, 需要与createhome配合使用。 groups: 指定用户的属组。 uid: 指定用的uid。 password: 设定用户密码, password参数需要接受md5加密后的值. 特别注意: 指定password参数时, 不能使用明文密码, 因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中, 所以需要先将密码字符串进行加密处理, 然后将得到的字符串放到password中即可。 name: 指定用户名。 system: 是否为系统用户。 表示默认创建为普通用户, 而非系统用户, 指定是用yes. 也就是说yes是默认创建为普通用户, 而非系统用户; update_password: 修改用户密码, 其中always: 新密码和旧密码不同时进行修改; on_create: 为新创建的用户指定密码. createhome: 创建家目录, 其中yes表示默认项, 即创建用户默认是有家目录的; no表示创建用户时不创建家目录. remove: 其中yes是删除用户家目录, 需要指定此参数; no是默认项, 删除用户时默认不删除用户的家目录. 当state=absent时, remove=yes则表示连同家目录一起删除, 等价于userdel -r。 state: 用户状态是创建还是删除. (present, absent) ;默认为present; 其中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密钥类型将取决于目标主机上的实现。
使用bash shell添加用户haha,将组"管理员"和"开发人员"附加到用户组
[root@ansible-server ~]# ansible web-nodes -m user -a "name=haha shell=/bin/bash groups=admins,developers append=yes"
增加用户anhui (先对密码做明文到密文的处理)
[root@ansible-server ~]# echo "anhui@123" | openssl passwd -1 -stdin
$1$rj74jCVy$NDW80bgY0DUTuHUlSunVv1
[root@ansible-server ~]# ansible web-nodes -m user -a 'name=anhui system=yes password=$1$rj74jCVy$NDW80bgY0DUTuHUlSunVv1 state=present'
删除用户anhui
[root@ansible-server ~]# ansible web-nodes -m user -a 'name=anhui remove=yes state=absent'
更新用户kevin的密码 (先对新密码kevin@bj123做明文到密文的处理)
[root@ansible-server ~]# echo "kevin@bj123"| openssl passwd -1 -stdin
$1$5X5bH5.J$RwE6o6g6bX953W7vAaizv/
[root@ansible-server ~]# ansible web-nodes -m user -a 'name=kevin update_password=always password=$1$5X5bH5.J$RwE6o6g6bX953W7vAaizv/'
在~/.ssh/id_rsa中为用户bobo创建一个2048位的SSH密钥
[root@ansible-server ~]# ansible web-nodes -m user -a 'name=bobo generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'
[root@ansible-server ~]# ansible web-nodes -m group -a "name=yang gid=888"
[root@ansible-server ~]# ansible web-nodes -m user -a "name=yang uid=888 group=888 shell=/sbin/nologin create_home=no"
group模块 gid: 指定用的gid。 name: 指定用户名。 state: 是创建还是删除, (present,absent); system: 如果是,则表示创建的组是系统组;
[root@ansible-server ~]# ansible web-nodes -m group -a "name=huoqiu state=present"
[root@ansible-server ~]# ansible web-nodes -m group -a "name=chenzun gid=897 state=present"
[root@ansible-server ~]# ansible web-nodes -m group -a "name=huoqiu state=absent"
|