在使用Ansible时,如果不是以root用户身份执行(如果客户端是以root用户身份执行),请记录下来
目前为止,为了熟悉Ansible,我一直以root用户身份进行操作。但实际运用中并不会频繁使用root用户,因此这次我来尝试以下的方式进行验证。
1. 执行环境 (shí
1. 关于执行用户
-
- Ansibleサーバー
-
- サーバー名:brighton001
-
- 実行ユーザー:ansible
-
- クライアント
-
- サーバー名:brighton002
- 実行ユーザー:root
2. 关于ansible执行环境
创建ansible用户后,需要进行ansible环境的设置,包括目录结构等,按照以下方式进行创建。
/home/ansible
├─ .ssh
│ ├─ id_rsa.pub このファイルの中身を、クライアントへコピー
└─ playbooks
├─ hosts インベントリーファイル
├─ files copyモジュールなどでクライアントに配布するファイルを格納
│ └─ idex.html テスト用ファイル
├─ vars 変数ファイルを格納
│ └─ test1.yml 変数ファイル
└─ tasks playbookを格納
└─ test1.yml playbook
2. 创建ansible用户
在 Ansible 服务器上创建一个 ansible 用户。
创建ansible组
以Ansible为组名,在GID为9010的条件下进行创建。
创建一个名为ansible的组,并将其GID设置为9010。
确认在执行后创建了该组。
# grep ansible /etc/group
ansible:x:9010:ansible
2. 创建ansible用户
创建用户ansible,UID为9010,gecos设置为ansible user。
# 创建用户: useradd -c “ansible 用户” -g ansible -G 9010 -u 9010 ansible
确认在执行后用户已经被创建。
# grep ansible /etc/passwd
ansible:x:9010:9010:ansible user:/home/ansible:/bin/bash
3. SSH公钥的设置
使用Ansible用户来执行。
生成RSA类型的SSH密钥。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa): ←そのままEnter
Created directory '/home/ansible/.ssh'.
Enter passphrase (empty for no passphrase): ←そのままEnter
Enter same passphrase again: ←そのままEnter
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
The key fingerprint is:
(省略)
将公钥发送给客户端
由于在/home/ansible/.ssh目录中生成了名为id_rsa.pub的公钥,因此将其发送到客户端。这次客户端将以root用户身份运行,所以要发送到/root/.ssh目录中。同时,请确保以此方式表明是Ansible服务器的ansible用户。
将id_rsa.pub文件复制到root@brighton002服务器上的/root/.ssh/id_rsa.pub_ansible_brighton001文件夹中。
为了无需密码执行操作,在客户端的authorized_keys文件中添加要发送的文件的内容。
使用SSH连接到brighton002服务器,以root用户登录,并将/root/.ssh/id_rsa.pub_ansible_brighton001文件的内容追加到/root/.ssh/authorized_keys文件中。
3. 进行Ansible环境设置
1. 创建所需的目录 de
在创建playbook时,需要创建必要的目录。
$ mkdir playbooks
$ mkdir playbooks/vars
$ mkdir playbooks/files
$ mkdir playbooks/tasks
创建playbooks文件夹
创建playbooks/vars文件夹
创建playbooks/files文件夹
创建playbooks/tasks文件夹
2. 创建inventory文件 inventory
先创建一个inventory文件。
首先,为这次制作一个。
[web]
brighton002
4. 制作剧本等等
1. 制作playbook
在 tasks 目录下创建 playbook。
这次执行的内容如下:
– 安装Apache
– 启动Apache
– 启动Firewalld
– 允许Firewalld通过80端口
– 将index.html文件发送给客户端
– 设置haldlers并添加以下处理:
– 如果Firewalld有更改,则重新启动
– 如果index.html有更改,则重新启动
实际上编写的playbook如下所示。
- hosts: web
remote_user: root
vars_files:
- ../vars/test1.yml
tasks:
- name: install apache
yum: name="{{module}}"
- name: appache start
systemd: name=httpd state=started enabled=yes
- name: firewalld start
systemd: name=firewalld state=started enabled=yes
- name: firewall-cmd allow port 80
firewalld: port={{http_port}}/tcp permanent=true state=enabled
notify: restart firewalld
- name: copy index.html
copy:
src: "{{src_idx_html}}"
dest: "{{dest_dir}}"
mode: "{{mode}}"
notify: restart apache
handlers:
- name: restart firewalld
service: name=firewalld state=restarted
- name: restart apache
systemd: name=httpd state=restarted
-
- remote_userディレクティブ
-
- remote_user ディレクティブを設定することで、クライアントにログインすることが可能となる。
- ※設定しなかった場合、Gathering Factsの段階で、Permission deniedのためログインできないというエラーが表示される
TASK [Gathering Facts] *********************************************************************************************************************
fatal: [brighton002]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", "unreachable": true}
to retry, use: --limit @/home/ansible/playbooks/tasks/test1.retry
-
- 変数の設定について
- 変数を設定する場合、通常 “{{変数名}}”とおこなうが、firewalldタスクでポート番号を指定する場合、”{{http_port}}”とすると、firewalldがダブルクオーテーションつき”80″でポート番号を設定しようして、エラーとなった。なぜかはわかりませんでした。なので、””なしで変数設定しています。
TASK [firewall-cmd allow port 80] **********************************************************************************************************
fatal: [brighton002]: FAILED! => {"changed": false, "msg": "ERROR: Exception caught: org.fedoraproject.FirewallD1.Exception: INVALID_PORT: '\"80\"' is invalid port range Permanent operation"}
to retry, use: --limit @/home/ansible/playbooks/tasks/test1.retry
创建变量文件
在vars目录中创建一个变量文件。
---
module: httpd
http_port: 80
src_idx_html: ../files/index.html
dest_dir: /var/www/html
mode: 0644
创建一个 index.html 文件。
创建一个用于确认的 index.html 文件。
<h1>
hello! this is an ansible test!!
</h1>
执行playbook
打开playbook并执行。
2. 运行playbook。
3. 执行playbook。
4. 打开并运行playbook。
执行创建的playbook!执行目录为/home/ansible/playbooks。
使用中国话进行本地化重新表达:
在主机上运行以下命令,执行 Ansible 的 playbook 文件 “test1.yml”,主机文件为 “hosts”:
ansible-playbook -i hosts ./task/test1.yml
- 実行結果
$ ansible-playbook -i hosts ./tasks/test1.yml
PLAY [web] *************************************************************************************
TASK [Gathering Facts] *************************************************************************
ok: [brighton002]
TASK [install apache] **************************************************************************
changed: [brighton002]
TASK [appache start] ***************************************************************************
changed: [brighton002]
TASK [firewalld start] *************************************************************************
changed: [brighton002]
TASK [firewall-cmd allow port 80] **************************************************************
changed: [brighton002]
TASK [copy index.html] *************************************************************************
changed: [brighton002]
RUNNING HANDLER [restart firewalld] ************************************************************
changed: [brighton002]
RUNNING HANDLER [restart apache] ***************************************************************
changed: [brighton002]
PLAY RECAP *************************************************************************************
brighton002 : ok=8 changed=7 unreachable=0 failed=0
能够看出没有问题顺利成功的事情。
2. 检查执行结果
- Apacheの導入確認
# rpm -qa | grep httpd
httpd-tools-2.4.6-67.el7.centos.6.x86_64
httpd-2.4.6-67.el7.centos.6.x86_64
- Apacheのプロセス確認
# ps -ef |grep http
root 6906 1 0 13:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 6907 6906 0 13:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 6908 6906 0 13:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 6909 6906 0 13:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 6910 6906 0 13:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 6911 6906 0 13:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 6925 5169 0 13:05 pts/1 00:00:00 grep --color=auto http
- index.htmlファイルの確認
# ls -l /var/www/html/index.html
-rw-r--r-- 1 root root 45 Jan 17 13:03 /var/www/html/index.html
# cat /var/www/html/index.html
<h1>
hello! this is an ansible test!!
</h1>
- firewalldの確認
# firewall-cmd --list-ports
80/tcp
-
- httpdの起動状況
-
- 現在起動していることと、自動起動の設定がされていることがわかる。
- ※ /usr/lib/systemd/system/httpd.service; enabled ・・・ enabledのため、自動起動の設定
# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2018-01-17 13:11:49 JST; 1min 1s ago
-
- firewalldの起動状況
-
- 現在起動していることと、自動起動の設定がされていることがわかる。
- ※ /usr/lib/systemd/system/firewalld.service; enabled ・・・ enabledのため、自動起動の設定
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-01-17 13:11:47 JST; 2min 25s ago
-
- 画面の確認
- テストしているネットワークからは、Webアクセスが出来ないため、サーバー上で、curlコマンドを実行し、確認
$ curl -l http://XXX.XXX.XXX.XXX
<h1>
hello! this is an ansible test!!
</h1>
6. 我的想法
由于客户是以root用户身份运行的,所以我能够做得相对轻松。
实际上,我无法确定是否客户是root用户,这要根据环境而定。
下次,我想进行针对客户不是root用户的情况进行测试。