Ansible基础操作
CentOS安装ansible
示例:
yum instsll -y epel-release
yum install -y ansible其它系统安装请参考Ansible安装
Ansible配置文件
/etc/ansible/ansible.cfg # 主配置文件
/etc/ansible/hosts # Inventory定义Inventory
vi /etc/ansible/hosts
[dbserver]
192.168.1.2 ansible_sudo_pass='123456' # ansibble_sudo_pass是当连接的用户不是root时,要使用sudo命令的密码
[webserver]
192.168.1.3 ansible_ssh_user=admin ansible_ssh_pass='12345' # 默认remote_user=root,在ansible.cfg中可以修改
192.168.1.4使用秘钥方式连接服务器
ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.2Ansible命令基础
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
<host-pattern> 这次命令对哪些主机生效的
inventory group name
ip
all
-f forks 一次处理多少个主机
-m module_name 要使用的模块
-a args 模块特有的参数常见模块
command Ansible的默认模块,可以运行远程权限范围所有的shell命令,不支持变量和管理符。
ansible all -a 'date'cron 计划任务
- month # 月
- minute # 分
- day # 天
- hour # 小时
- weekday # 周几
- job # 指定任务
- state # 表示添加还是删除
- present # 添加(默认)
- absent # 删除
添加、删除定时任务示例
ansible test -m cron -a 'minute="*/2" job="echo abc >> /tmp/log" name="test cron job"'
ansible test -a 'crontab -l'
ansible test -m cron -a 'minute="*/2" job="echo abc >> /tmp/log" name="test cron job" state=absent'
user 用户账号管理
- name
- uid
- state
- present # 添加(默认)
- absent # 删除
- group # 所属组
- groups # 附加组
- home
- createhome # 是否创建家目录
- comment # 注释信息
- system # 是否为系统用户
示例
ansible all -m user -a 'name="username"'
ansible all -m user -a 'name="username" state=absent'group 用户组管理
-
gid
-
name # 组外
-
state
-
- present # 添加(默认)- absent # 删除
-
system # 是否为系统用户
示例
ansible test -m gruop -a 'name=mysql gid=306 system=yes'
ansible test -m user -a 'name=mysql uid=306 system=yes group=mysql'copy 复制文件
- src
- dest
- owner # 所有者
- group # 所有组
- mode # 权限
- content # 取代src=,直接秀此处的信息生成文件内容
示例
ansible test -m copy -a 'src=./filename dest=/root/ owner=root mode=640'
ansible test -m copy -a 'content="Hello world" dest=/tmp/txtfile'file 设置文件属性
- path|dest|name # 要操作的文件具体路径
示例
# 修改文件权限
ansible dbserver -m file -a 'owner=mysql group=mysql mode=644 path=/tmp/txtfile'
# 链接文件
ansible dbserver -m file -a 'path=/newpath/txtfile src=/tmp/txtfile state=link'
ping 测试指定主机是否能连接
ansible test -m pingservice 管理服务运行状态
- enabled # 是否开机启动
- name # 服务名
- state # 指定服务状态
- started # 启动
- stoped # 停止
- restarted # 重启
- arguments # 服务参数
示例
ansible dbserver -m service -a 'enabled=true name=mysqld state=started'shell 在远程主机上运行命令,可以使用管道符或变量等复杂命令
示例
ansible all -m shell -a 'cat /etc/passwd | grep root'在Ansible中,-a 选项和 shell 模块都可以用于在目标主机上执行命令,但它们有一些区别。
-
-a 选项:
-a选项用于在命令行中指定Ad-hoc命令,允许直接执行简单的命令。例如:ansible all -i inventory_file -a 'command_to_execute'这种方式适用于简单的任务,但对于复杂的任务,尤其是需要使用管道、重定向或其他高级Shell功能的任务,可能会变得笨拙和不方便。
-
shell 模块:
shell模块是一个Ansible模块,允许你在目标主机上运行复杂的Shell命令。使用这个模块,你可以在Playbook中以更结构化的方式定义命令。示例:--- - name: Example Playbook with shell module hosts: all tasks: - name: Run complex command with shell module shell: | echo "Hello, world!" mkdir /tmp/example touch /tmp/example/file.txt在这个示例中,
shell模块允许你通过|符号定义多行Shell命令。
总体而言,推荐使用 shell 模块,尤其是在编写更复杂的Playbooks时。它提供了更好的可读性和维护性,而 -a 选项更适合在命令行上执行简单的任务。
script 将本地服务复制到运程主机上运行
示例
ansible test -m script -a 'sh/test.sh'yum 安装程序
- name # 包名
- state
- present|latest # 安装
- absent # 卸载
示例
ansible all -m yum -a 'name=ntpd'
# 卸载
ansible all -m yum -a 'name=ntpd state=absent'setup 收集远程主机的信息,如操作系统版本,IP地址等
示例
ansible all -m setup远程用户非root,使用sudo/su执行
ansible 1.9之前的操作
先调整一下/etc/ansible/hosts的配置
[node2]
192.168.1.2 ansible_sudo_pass='123456' # ansibble_sudo_pass是当连接的用户不是root时,要使用sudo命令的密码
[webserver]
192.168.1.3 ansible_ssh_user=admin ansible_ssh_pass='12345' # 默认remote_user=root,在ansible.cfg中可以修改
192.168.1.4在管理机上执行
ansible node2 -a "touch /data/file" --sudo # --sudo,以sudo到root的方式执行
ansible node2 -a "touch /data/file2" -u admin --sudo # -u 指定用户
ansilbe 1.9之后的版本使用become替代了sudo/su
修改配置文件/etc/ansible/ansible.cfg
...
[privilege_escalation]
become=True # 开启
#become_method=sudo # 方式 sudo su
#become_user=root # 切换到的用户,
#become_ask_pass=False # 是否询问密码,如果在hosts文件中配置了,可以配置为False
...修改/etc/ansible/hosts内容
[node1]
192.168.1.2 ansible_become_pass='12345' # sudo换成become
Ansible playbook
结构:
- inventory # 应对要操作的主机
- modules # 调用哪些模块做操作
- ad hoc commadns # 在这些主机上执行哪些命令
- playbooks
- tasks # 任务,即调用模块完成的操作
- variable # 变量
- templates # 模板
- handlers # 触发器,由某件事件触发执行的操作
- roles # 角色
playbook示例
- hosts: 172.23.210.27,172.23.210.28 # 要执行的目标主机或主机组
remote_user: root # 远程用户
vars: # 定义变量
http_port: 8080 # 具体变量
tasks: # 定义一个任务
- name: create new file # 任务名称
file: name=/tmp/playtestfile.txt state=touch # 调用`file`模块,和创建文件操作
- name: install package # 任务名
yum: name=mysqld # 调用`yum`模块,并安装msyqld
- name: config mysqld
template: src=./my.cnf dest=/etc/my.cnf
notify: # 触发器,当条件触发后要做的操作,配合handlers使用
- restart mysqld # 引用的handlers的名字
- name: start mysqld
service: name=mysqld state=started
handlers: # notify定义的触发后要执行的操作
- name: restart mysqld # handlers的名称,跟notify引用的一样
service: name=mysqld state=restarted # 触发要执行的操作运行Ansible playbook
ansible-playbook playbook.yaml
playbook变量的赋值与调用
- hosts: all
remote_user: root
vars:
dir_name: testname
tasks:
- name: create new dir
command: mkdir /tmp{{ dir_name }} # 调用变量需要用两个大括号{{}}将其括起来通过playbook 使用yum删除和安装软件
在 Ansible 中,你可以通过 playbook 使用 yum 模块来删除和安装软件。这对于在基于 Red Hat 的系统(如 CentOS, Fedora, RHEL 等)上管理软件包非常有用。下面是如何编写这样的 playbook 的示例。
安装软件包
要安装软件包,你可以使用 yum 模块并设置 state 参数为 present。这会确保指定的软件包已安装。
- name: Install a software package
hosts: all
become: yes # 使用超级用户权限
tasks:
- name: Install Apache
yum:
name: httpd # 软件包名
state: present删除软件包
要删除软件包,将 state 参数设置为 absent。这将确保指定的软件包未安装在系统上。
- name: Remove a software package
hosts: all
become: yes # 使用超级用户权限
tasks:
- name: Remove Apache
yum:
name: httpd # 软件包名
state: absent在 Ansible 中,state 是指软件包的期望状态。对于 yum 模块,state 参数指定了软件包的安装或删除行为。
state: present 表示 确保软件包已经安装。如果目标系统上尚未安装该软件包,Ansible 会自动安装它;如果已安装,Ansible 不会做任何改变。
另外,state 参数还可以设置为:
absent:表示确保软件包已被删除。如果软件包已安装,Ansible 会卸载它;如果已删除,它不会执行任何操作。
latest:表示确保软件包为最新版本。如果目标系统上没有安装该软件包,或者已安装的版本不是最新的,Ansible 会安装或更新到最新版本。运行 playbook
保存你的 playbook 为一个文件(例如 manage_packages.yml),然后在包含你的远程主机的 Ansible inventory 的情况下运行它:
ansible-playbook manage_packages.yml主机信息可以写到/etc/ansible/hosts和用-i参数单独引用的区别
在 Ansible 中,主机信息可以写到两个地方:/etc/ansible/hosts 文件和通过 -i 参数单独引用。这两种方式都可以定义 Ansible 的目标主机,但它们有一些区别。
1. /etc/ansible/hosts 文件
- 位置:这是 Ansible 默认的主机清单文件(Inventory)。
- 用途:当你运行
ansible或ansible-playbook命令时,Ansible 会默认查找这个文件,除非你通过-i参数指定了其他的清单文件。 - 内容:通常是一个简单的文本文件,里面列出了目标主机的 IP 地址或主机名,并可以按组进行组织。
- 管理:适合用于长期管理和存储主机信息,特别是当你有一个固定的基础设施环境时,主机清单文件可以长期保持不变。
示例:
# /etc/ansible/hosts 文件
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com2. -i 参数单独引用
- 用途:通过
-i参数指定自定义的清单文件或主机信息。当你运行ansible或ansible-playbook命令时,Ansible 会根据你指定的清单文件来查找主机信息。 - 灵活性:这种方式允许你动态地指定主机清单,尤其适用于临时任务、特定的环境或调试场景。你可以在命令行中直接引用不同的清单文件或主机列表,而不必修改
/etc/ansible/hosts。 - 文件类型:你可以使用任何符合 Ansible 清单格式的文件,包括
.ini文件、YAML 文件,甚至直接在命令行中列出主机。
示例:
ansible-playbook -i custom_inventory.ini my_playbook.yml或直接在命令行中指定主机:
ansible-playbook -i "web1.example.com,web2.example.com," my_playbook.yml注意:在此示例中,主机列表末尾的逗号(`,`)是必须的,否则 Ansible 会将其视为主机组名而不是单个主机。这是因为 Ansible 期望-i参数值是一个主机列表,且每个主机之间用逗号分隔。区别总结:
-
默认位置 vs. 自定义位置:
/etc/ansible/hosts是默认的主机清单文件,适用于固定或长期的主机管理。-i参数用于临时或自定义的清单文件,适用于不同的清单配置或单次任务。
-
灵活性:
/etc/ansible/hosts文件适合稳定的环境,便于长期管理。-i参数提供了灵活性,支持临时指定或调试不同的主机清单。
-
覆盖关系:
- 如果你同时指定了
-i参数和/etc/ansible/hosts文件,-i参数指定的文件会覆盖默认的/etc/ansible/hosts文件。
- 如果你同时指定了
-
使用场景:
- 使用
/etc/ansible/hosts时,适合在没有特殊需求的情况下集中管理主机。 - 使用
-i参数时,适合临时指定不同的主机清单或在脚本、自动化流程中动态生成主机列表。
- 使用